Erro ao tentar inserir uma propriedade de um ManagedBean e retorna null

7 respostas
EuclidesFilizola

Boa tarde caros amigos, eu estou tentando inserir uns dados de um formulario para tabela, e me deparei com o seguinte problema

<h:outputLabel value="Codigo da passagem: " for="cod_passagem"/>
		<h:inputText id="cod_passagem" value="#{solicitacaoMB.viagem.passagem.id}" />

e da o seguinte erro:

javax.el.PropertyNotFoundException: /pages/cadSolicitacao.xhtml @93,80 value="#{solicitacaoMB.viagem.passagem.id}": Target Unreachable, 'passagem' returned null

e aqui na minha entidade viagem o atributo passagem

@ManyToOne
	@JoinColumn(name="pktbsisv_passagem",nullable=true)
	private Passagem passagem;

Alguém poderia me da uma força ?

7 Respostas

daniel.info

Vc precisa chamar o construtor de passagem na classe Viagem
Passagem passagem = new Passagem();

EuclidesFilizola

Já tentei fazer o mesmo ,mas não funcionou.

=(

daniel.info

vc colocou os get e set de passagem?

EuclidesFilizola

sim coloquei

aqui meu mb

public class SolicitacaoMB {
	private SolicitacaoDAO solicitacaoDAO = new SolicitacaoDAO();
	private Solicitacao solicitacao = new Solicitacao();
	private Usuario usuario;
	private UsuarioDAO usuarioDAO = new UsuarioDAO();
	private Viagem viagem;
	private ViagemDAO viagemDAO = new ViagemDAO();
	private Passagem passagem;
	
	private static final long serialVersionUID = 1L;

	public SolicitacaoMB() {
		
	}
		
	public String iniciarFaces(){
		
		 viagem = new Viagem();	
		 setPassagem(new Passagem());
		 
	     return "Solicitacao";
	}
	public String inserirViagem(){
		
		
		viagemDAO.salvar(viagem);
		
		viagem = null;
		
		return "sucesso";
	}
	
	public Solicitacao getSolicitacao() {
		return solicitacao;
	}

	public void setSolicitacao(Solicitacao solicitacao) {
		this.solicitacao = solicitacao;
	}


	public void setSolicitacaoDAO(SolicitacaoDAO solicitacaoDAO) {
		this.solicitacaoDAO = solicitacaoDAO;
	}
	public SolicitacaoDAO getSolicitacaoDAO() {
		return solicitacaoDAO;
	}
	public Viagem getViagem() {
		return viagem;
	}
	public void setViagem(Viagem viagem) {
		this.viagem = viagem;
	}
	public ViagemDAO getViagemDAO() {
		return viagemDAO;
	}
	public void setViagemDAO(ViagemDAO viagemDAO) {
		this.viagemDAO = viagemDAO;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public Usuario getUsuario() {
		return usuario;
	}	

	public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}
	public UsuarioDAO getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setPassagem(Passagem passagem) {
		this.passagem = passagem;
	}

	public Passagem getPassagem() {
		return passagem;
	}

daniel.info

Bom,
seguindo sua lógica, vc executa o metodo iniciarFaces e então chama diretamente o set de passagem e cria um objeto,

vc poderia fazer o seguinte

private Passagem passagem;

     public String iniciarFaces(){  
           
          viagem = new Viagem();   
         // setPassagem(new Passagem());  
           passagem = new Passagem();
          //aqui já é possivel utilizar a instancia sem  problemas com nullPointer
           return "Solicitacao";  
     }

ou

private Passagem passagem = new Passagem();

     public String iniciarFaces(){  
     viagem = new Viagem();
     //aqui vc já consegue utilizar a instancia de passagem sem problemas porque já foi criado o objeto.
     return "Solicitacao";  
  }

e também

public SolicitacaoMB() {  
       viagem = new Viagem();
       passagem = new Passagem();         
  }

O Seu objeto está nulo no momento que vc tenta setar ele no seu xhtml, se não for isso, veja se vc declarou os MB no faces-config, ou AppicationContext caso use Spring.

EuclidesFilizola

Fala Daniel, já resolvi meu problema desta forma:

O problema não está dando no Managed Bean, e sim nos beans, ou seja, problema era no mapeamento das classes.

Agora deixa eu fazer outro questionamento.

O correto é construir managed-beans por entidade separadas ? Ou se deve construir 1 só, por página ?

Você saberia me responder ?

daniel.info

Entendi.
Aqui no meu trabalho criamos por entidades separadas.
Depois utilizamos o Spring para gerenciar tudo.
Não sei se é o correto, mas facilita, pois as vezes precisamos fazer comunicação entre dois managed-bens.

Criado 19 de outubro de 2009
Ultima resposta 20 de out. de 2009
Respostas 7
Participantes 2