Vraptor 3 gera NullPointer em converter

4 respostas
F

Boa tarde,

Eu criei um converter para uma entidade especifica "Usuario", porém o vraptor está levantando um nullpointer antes de chegar a execução ao meu converter:

import java.util.ResourceBundle;

import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.ioc.RequestScoped;

import com.coachingskills.cs.model.entity.AEntity;
import com.coachingskills.cs.model.entity.Usuario;
@Convert(Usuario.class)
@RequestScoped
public class IEntityConverter implements Converter<Usuario>{

    public Usuario convert(String value, Class<? extends Usuario> type, ResourceBundle bundle) {
	System.out.println("não implementado");
	return null;
    }
}
o erro ocorre na classe VRaptorInstantiator no metodo setPropertiesAfterConversions
private Object setPropertiesAfterConversions(Target<?> target, Parameters parameters) {
			List<Parameter> params = parameters.forTarget(target);
			 // Essa chamada retorna NULL
			Parameter parameter = findParamFor(params, target);
			// O nullpointer ocorre na linha abaixo, por qe a variavel parameter está nul
			Object converted = converterForTarget(target).convert(parameter.getValue(), target.getClassType(), localization.getBundle());

			return new NewObject(this, parameters.focusedOn(target), converted).valueWithPropertiesSet();
		}
Meu controller
@Resource
@Path("cadastro/usuario")
public class UsuarioController {
     public void gravar(Usuario usuario){
      ......
     }
}
a view
<form  method="POST" action="cadastro/usuario/gravar" >
	<input type="hidden" value="2" name="usuario.id">
	<input type="text" value="" name="usuario.nome">
	<input type="text" value="" name="usuario.email">
</form>
Debugando constatei que o vraptor levanta a seguinte exceção: java.lang.IllegalStateException: Expecting only one parameter named after Target(name=usuario, type=class com.xx.model.entity.Usuario), found instead [Parameter(usuario.nome -> teste), Parameter(usuario.email -> [email removido])]

Estou criando o converter apenas para que ele busque os dados no usuário em questão diretamento do banco, mas a execução nem chega ao meu converter, oque estou fazendo de errado?

4 Respostas

Lucas_Cavalcanti

ele não vai passar pelo converter pq não tem nenhum parametro do request que se chama só usuario.

se tiver um:

<input name="usuario" value="alguma coisa"/>

vai passar por lá…

esse nullPointer é estranho… Usuario é uma interface ou classe abstrata? tem construtor sem argumentos?

F

Lucas obrigado pela atenção, segue a entidade usuario:

// a classe AEntity tem apenas metodos utilitarios como por exemplo, para 
// saber se o usuário é novo ou se ele está ativo
@Entity
public class Usuario extends AEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int idusuario;
    @NotNull
    @Column(nullable = false)
    private String nome;
    @Length(min = 4)
    @NotNull
    @Column(nullable = false)
    private String login;
    @NotNull
    @Email
    @Column(nullable = false)
    private String email;
    @Length(min = 4)
    @Column(nullable = false)
    private String senha;
    @Column(nullable = false)
    private String telefone;
    @NotNull
    @Column(nullable = false)
    @Max(value = 1)
    private int ativo;

    public Usuario() {
       // construtor padrão
    }
    public int getIdusuario() {
	return idusuario;
    }
    public void setIdusuario(int idusuario) {
	this.idusuario = idusuario;
    }
    public String getNome() {
	return nome;
    }
    public void setNome(String nome) {
	this.nome = nome;
    }
    public String getLogin() {
	return login;
    }
    public void setLogin(String login) {
	this.login = login;
    }
    public String getEmail() {
	return email;
    }
    public void setEmail(String email) {
	this.email = email;
    }
    public String getSenha() {
	return senha;
    }
    public void setSenha(String senha) {
	this.senha = senha;
    }
    public String getTelefone() {
	return telefone;
    }
    public void setTelefone(String telefone) {
	this.telefone = telefone;
    }
    public int getId() {
	return getIdusuario();
    }
    public void setId(int pk) {
	setIdusuario(pk);
    }
    public String getDescricao() {
	return getNome();
    }
}

Trabalho com a versão 3.4.1 do Vraptor, se eu não utilizar um converter específico para está entidade o Vraptor instancia o objeto da forma correta, chegando com todos os dados devidamente setados no controller e assim como tu dissetes Lucas, a falha ocorre por que ele encontra um parâmetro cujo identificador seja “usuario” (assim como fora declarado no controller), é muito estranho porque no próprio guia de referência do framework, a documentação demonstra exemplos desta ordem, já procurei algo semelhante mas não encontrei, por isso abrir o tópico.
Apenas relembrando, estou criando o converter porque desejo que ocorra uma marge com os dados do banco com as alterações realizadas em tela, visando evitar erro do hibernate ao realizar o update.

Lucas_Cavalcanti

tentou trocar o

<input type="hidden" value="2" name="usuario.id">

por

<input type="hidden" value="2" name="usuario">

e implementar o converter pra pegar esse 2 e carregar o usuario?

F

Vou fazer desta foma mesmo, essa “adaptação” não deveria ser necessária, de todo modo agradeço muito pela ajuda, podemos encerrar ou marcar o tópico como “resolvido”.

Criado 10 de fevereiro de 2013
Ultima resposta 11 de fev. de 2013
Respostas 4
Participantes 2