Há algum tempo eu venho tendo este problema, mas tenho tratado isto manualmente e pontualmente.
Quando uso um select no formuário que aponta para um id de um model relacionado, sendo este objeto opcional, ao submit se o select for nulo (não selecionado), no VRaptor chega um objeto que não é nulo, mas com as propriedades nulas.
Ocorre que ao salvar o hibernate reclama de objeto não transiente nulo, quando uso cascade pra merge.
Eu resolvo este problema verificando:
//significa que o objeto é nulo e não deveria ser serializado
if(objeto.getSubObjeto() != null && objeto.getSubObjeto().getId() == null) {
objeto.setSubObjeto(null);
}
Isto resolve o problema, mas é chato ter que ficar fazendo na mão.
O problema acontece em outros casos também, sendo sempre o objeto não nulo com todas as propriedades nulas.
A pergunta é: tem como fazer com que o VRaptor identifique que este objeto deveria ser nulo e não deserializasse o mesmo?
Lucas eu estava debugando e o post não passa pelo filter e a deserialização está ocorrendo da mesma forma
O filter está sendo aplicado pois passa por ele em outras ocasiões, mas para a situação de post não está.
Coloquei o url-pattern /* no web.xml é isto mesmo?
Não sei se fui bem entendido, mas o que eu quero é se um objeto relacionado for nulo, ou seja, não foi selecionado na view o seu id, chegue no vraptor nulo e não instanciado com a propriedade id nula.
Esta solução resolveria?
Editei para postar mais um detalhe
No debug do vraptor está ocorrendo
11:04:52,559 DEBUG [OgnlParametersProvider] Applying bairro.id with []
Um exemplo do problema, como bairro é opcional, quero que o bairro chegue nulo se não for selecionado.
Acho que se o filter pegasse isto realmente iria funcionar, mas não está filtrando por alguma coisa que fiz errado (copiei exatamente o seu filter e o registrei no web.xml)
pois eh, não funciona mas descobri o problema.
estou usando ognl pra fazer upload, devido a um problema anterior onde upload de input file vazio dava exception?
removi o input file e tirei o enctype do form e funcionou, o parametro não chegou no vraptor.
se isso é durante um upload a solução não funciona mesmo…
no upload os parametros vêm diferentes =(
nesse caso vc teria que sobrescrever outro componente do VRaptor, talvez o componente que gera os parâmetros…
teria que copiar essa classe inteira pro seu projeto, anotá-la com @Component, e sobrescrever o método parametersThatStartWith pra não retornar parametros vazios (mesma solução do filtro quase)
Rapaz, eu consegui resolver o problema (somente criando uma regra após o filterKeys gerando outro map), mas tive que rescrever mais duas classes, que possuiam métodos não visíveis (OgnlFacade e VRaptorConvertersAdapter).
O ideal era melhorar a classe OgnlParametersProvider para permitir ser mais extensível, igual é diversas outras funcionalidade do VRaptor.
Apenas mudado os métodos pra protected e extendendo a classe vai funciona, ou gera duplicidade de dependência na injeção?
assim só sobrecarregaria o método em questão!
nota: a propriedade request tb deve ser protected neste caso, e pra ficar mais flexível mudaria o acesso de todas!
acho que mudar o modificador dos atributos não é legal… se a classe filha precisar de request ela já vai ter recebido no construtor e pode colocar no seu próprio atributo.