Objeto exibindo valor igual a null

11 respostas
java
B

Boa tarde galera,

Sou iniciante em jsf e jpa e estou tentando praticar alguns exercícios de um curso o qual tenho feito. A minha dúvida seria a seguinte, tenho um formulário xhtml o qual devo preencher o nome do fabricante de um carro e após clicar no botão “Salvar” ele deverá fazer a persistência e salvar a informação no banco de dados, porem isso não tem ocorrido, toda vez que clico no botão é exibido uma mensagem contida na minha exception, a qual deverá ser executada caso eu deixe o campo “fabricante” em branco, como eu coloquei um system.out.println contido dentro desse metodo “salvar”, vejo que o retorno do meu bean tem sido null. Tentei verificar se poderia ser algo relacionado ao escopo que estou usando, porem mesmo alterando não consegui obter resultados. segue o meu código abaixo, qualquer ajuda já será de grande valia.

XHTML

<ui:composition template="/WEB-INF/template/LayoutPadrao.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:o="http://omnifaces.org/ui">

<ui:define name="titulo">Novo fabricante</ui:define>

<ui:define name="corpo">
	<f:metadata>
		<!--  
		<o:viewParam name="fabricante" value="#{cadastroFabricanteBean.fabricante}" />
		 -->
	</f:metadata>

	<h1>Novo fabricante</h1>

	<h:form id="frmCadastro">
		<p:messages id="messages" autoUpdate="true" closable="true" />

    	<p:toolbar style="margin-top: 20px">
    		<p:toolbarGroup>
    			<p:commandButton process="@this" value="Salvar" id="botaoSalvar" action="#{cadastroFabricanteBean.salvar}" update="frmCadastro"/>
    		</p:toolbarGroup>
    		<p:toolbarGroup align="right">
				<p:button value="Pesquisa" />
			</p:toolbarGroup>
    	</p:toolbar>
    	
    	<p:panelGrid columns="2" id="painel" style="width: 100%; margin-top: 20px"
    			columnClasses="rotulo, campo">
    		<p:outputLabel value="Código" for="codigo"/>
    		<p:inputText id="codigo" size="20" maxlength="20" value="#{cadastroFabricanteBean.fabricante.codigo}" readonly="true"/>
    		
    		<p:outputLabel value="Nome" for="nome"/>
    		<p:inputText id="nome" size="60" maxlength="80" value="#{cadastroFabricanteBean.fabricante.nome}"/>
    	</p:panelGrid>
	</h:form>
</ui:define>

</ui:composition>

BEAN

package com.algaworks.curso.jpa2.controller;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import jpa2.modelo.Fabricante;
import jpa2.service.CadastroFabricanteService;
import jpa2.service.NegocioException;
import jpa2.util.jsf.FacesUtil;

@ManagedBean(name = "cadastroFabricanteBean")
@Named
@ViewScoped
public class cadastroFabricanteBean implements Serializable {


	@Inject
	private CadastroFabricanteService cadastroFabricanteService;
	private Fabricante fabricante;
	
	
	/*
	 * setters and getters
	 */
	public Fabricante getFabricante() {
		return fabricante;
	}
	public void setFabricante(Fabricante fabricante) {
		this.fabricante = fabricante;
		System.out.println("O nome do fabricante é " + fabricante.getNome());
	}
	
	
	// esse metodo é chamado toda vez que o bean é criado
	@PostConstruct
	public void init() {
		
	    this.Limpar();
		System.out.println("Inicalizou a classe cadastroFabricanteBean");
	}
	
	public void Limpar() {
		
		this.fabricante = new Fabricante();
	}
	
	public void salvar() {
		
		try {
			
			this.cadastroFabricanteService.Salvar(fabricante);
			FacesUtil.addSuccessMessage("Fabricante salvo com sucesso");
		}
		catch(NegocioException e) {
			
			FacesUtil.addErrorMessage(e.getMessage());
			System.out.println("O nome do fabricante é " + fabricante.getNome());
		}
	}
}

SERVICE, o qual recebe as informações vindo da minha bean

public class CadastroFabricanteService implements Serializable {

	@Inject 
	private FabricanteDAO fabricanteDao;

	
	public void Salvar(Fabricante f) throws NegocioException {
		
		
		if(f.getNome() == null || f.getNome().trim().equals("")) {
			
			throw new NegocioException("O nome do fabricante é obrigatório");
		}
		
		this.fabricanteDao.Salvar(f);
	}
    }

MINHA EXCEPTION, chamada quando o campo “fabricante” estiver em branco

`

public class NegocioException extends Exception {


	public NegocioException(String message) {
		
		super(message);
	}
}

DAO, a qual fará a persistência salvando no banco

public class FabricanteDAO implements Serializable {


@Inject
private EntityManager em;

public void Salvar(Fabricante f) {
	
	em.getTransaction().begin();
	em.persist(f);
	em.getTransaction().commit();
}

}

Quando digito o nome do fabricante e clico no botão “salvar”, ele dá a mensagem referente a exception e meu system.out.println retorna que o fabricante é null.

Desde já agradeço por qualquer ajuda.

11 Respostas

C

e ai cara :smiley: , mudei um pouco a lógica de instancia do fabricante. tente vê se funciona

ficaria assim sua bean :

public class cadastroFabricanteBean implements Serializable {


	@Inject
	private CadastroFabricanteService cadastroFabricanteService;
	private Fabricante fabricante = new Fabricante();
	
	
	/*
	 * setters and getters
	 */
	public Fabricante getFabricante() {
		return fabricante;
        }	
	// esse metodo é chamado toda vez que o bean é criado
	@PostConstruct
	public void init() {	
		System.out.println("Inicalizou a classe cadastroFabricanteBean");
	}
	
	public void Limpar() {
		this.fabricante = new Fabricante();
	}
	
	public void salvar() {
		
		try {
			
			this.cadastroFabricanteService.Salvar(fabricante);
			FacesUtil.addSuccessMessage("Fabricante salvo com sucesso");
		}
		catch(NegocioException e) {
			FacesUtil.addErrorMessage(e.getMessage());
			System.out.println("O nome do fabricante é " + fabricante.getNome());
		}
	}
C

porque você usa as annotações @ManagerBean e @Named junta?, fiquei um pouco confuso

B

Ola C0deuniversal,

Testei aqui o código com as mudanças porem continua retornando “O nome do fabricante é null…”

Sobre o @ManagedBean e o @Named juntos, foi apenas um vacilo de iniciante, rs. Já corrigi aqui.

Desde já agradeço por qualquer ajuda.

C

você deixou a @Named né?, recomendo ela… e por questão de compartibilidade, você deve usar a @ViewScoped do pacote javax.faces.view.ViewScoped , isso faz com que o escope seja gerenciado pelo CDI , garantido assim a injeção de depedencia, e faz mais sentido uma vez que você implementou Serializable, compartilhe novamente sua bean!

B

Ola,

Deixei sim, segue abaixo a bean.

`

package jpa2.controller;

 import java.io.Serializable;
 import javax.annotation.PostConstruct; 
 import javax.faces.bean.ViewScoped;
 import javax.inject.Inject; 
 import javax.inject.Named;

import jpa2.modelo.Fabricante;
import jpa2.service.CadastroFabricanteService;
import jpa2.service.NegocioException;
import jpa2.util.jsf.FacesUtil;

@Named
@ViewScoped
public class cadastroFabricanteBean implements Serializable {


	@Inject
	private CadastroFabricanteService cadastroFabricanteService;
	private Fabricante fabricante = new Fabricante();
	
	
	/*
	 * setters and getters
	 */
	public Fabricante getFabricante() {
		return fabricante;
	}
	/*
	public void setFabricante(Fabricante fabricante) {
		this.fabricante = fabricante;
		System.out.println("O nome do fabricante é " + fabricante.getNome());
	}
	*/
	
	// esse metodo é chamado toda vez que o bean é criado
	@PostConstruct
	public void init() {
		
	    this.Limpar();
		System.out.println("Inicalizou a classe cadastroFabricanteBean");
	}
	
	public void Limpar() {
		
		this.fabricante = new Fabricante();
	}
	
	public void salvar() {
		
		try {
			
			this.cadastroFabricanteService.Salvar(fabricante);
			FacesUtil.addSuccessMessage("Fabricante salvo com sucesso");
		}
		catch(NegocioException e) {
			
			FacesUtil.addErrorMessage(e.getMessage());
			System.out.println("O nome do fabricante é " + fabricante.getNome());
		}
	}

}
`

B

Mais alguém pode tentar ajudar ai galera???

C

hey mano :D, cá estou denovo, veja que a sua anotação do ViewScoped está errada, você importou de import javax.faces.bean.ViewScoped; e não de javax.faces.view.ViewScoped

B

Ola C0deuniversal,

Obrigado mais uma vez por sua ajuda, a dúvida agora é a seguinte, ao tentar fazer essa importação, notei que não existe essa opção javax.faces.view.ViewScoped.

Verificando aqui nesse outro artigo, o qual um outro colega parece ter passado por algo parecido

http://respostas.guj.com.br/27729-javaxfacesviewviewscoped-nao-funciona-no-mojarra-228-

, tentei seguir as recomendações que ele fala lá, adicionando no web.xml o gerenciador de beans.

`

<resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>

`

E colocando também o arquivo context.xml na pasta WebContent(ou webapp)/META-INF, com o seguinte conteúdo:

`

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- disables storage of sessions across restarts --> 
<Manager pathname=""/>
<Resource name="BeanManager" auth="Container" 
    type="javax.enterprise.inject.spi.BeanManager" 
    factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>

`

Porem mesmo assim continua não reconhecendo o javax.faces.view.ViewScoped, estou usando o Mojarra 2.1.7. Vou tentar atualiza-lo pra ver se pode resolver também. Caso tenha outra ideia, agradeço desde já por qualquer ajuda.

B

Adicionei o jsf-impl-2.2.9.jar e o jsf-api-2.2.9.jar e nada…

C

Pela sua aplicação ser para estudo recomendo que delete tudo :smiley: . sim manda brasa no delete, e com calma criei uma nova, tenha em mente o que precisa, manda um email para mim [email removido] , que vou tentar pelo menos te ajuda a entender o que tá escrito ai, você tá usando CDI, mas pelo visto não entendi o motivo, vamos para e vê as coisas como calma,aguardo contanto!

B

Blz C0deuniversal,

Te mandei o email, mais uma vez muito obrigado.

Criado 15 de junho de 2016
Ultima resposta 18 de jun. de 2016
Respostas 11
Participantes 2