0
Hello guys I’m having jsf application problems, cdi, when new product registration give null return, but when editing makes editing normally. give error
ago 28, 2016 12:52:37 AM com.sun.faces.lifecycle.ProcessValidationsPhase execute
ADVERTÊNCIA: /produtos/CadastroProduto.xhtml @40,74 value="#{cadastroProdutoBean.produto.sku}": Target Unreachable, 'produto' returned null
javax.el.PropertyNotFoundException: /produtos/CadastroProduto.xhtml @40,74 value="#{cadastroProdutoBean.produto.sku}": Target Unreachable, 'produto' returned null
Caused by: javax.el.PropertyNotFoundException: Target Unreachable, 'produto' returned null
cadastral.xhtml
<ui:define name="titulo">#{cadastroProdutoBean.editando ? 'Edição de Produto' : 'Novo Produto'}</ui:define>
<ui:define name="corpo">
<f:metadata>
<o:viewParam name="produto" value="#{cadastroProdutoBean.produto}" />
<f:event listener="#{cadastroProdutoBean.inicializar}" type="preRenderView"/>
</f:metadata>
<h:form id="frmProduto">
<h1>#{cadastroProdutoBean.editando ? 'Edição de Produto' : 'Novo Produto'}</h1>
<p:messages autoUpdate="true" closable="true"/>
<p:toolbar style="margin-top: 20px">
<p:toolbarGroup>
<p:button value="Novo" outcome="/produtos/CadastroProduto" />
<p:commandButton value="Salvar" id="botaoSalvar"
action="#{cadastroProdutoBean.salvar}" update="@form"/>
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:button value="Pesquisa" outcome="/produtos/PesquisaProdutos" />
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="2" id="painel" style="width: 100%; margin-top: 20px"
columnClasses="rotulo, campo">
<p:outputLabel value="SKU" for="sku"/>
<p:inputText id="sku" size="20" maxlength="20"
value="#{cadastroProdutoBean.produto.sku}"/>
<p:outputLabel value="Nome" for="nome"/>
<p:inputText id="nome" size="60" maxlength="80"
value ="#{cadastroProdutoBean.produto.nome}"/>
<p:outputLabel value="Categoria" for="categoria"/>
<p:selectOneMenu id="categoria" value="#{cadastroProdutoBean.categoriaPai}">
<f:selectItem itemLabel="Selecione a categoria"/>
<f:selectItems value="#{cadastroProdutoBean.categoriasRaizes}" var="categoria"
itemValue="#{categoria}" itemLabel="#{categoria.descricao}"/>
<p:ajax listener="#{cadastroProdutoBean.carregarSubCategorias}" update="subcategoria"/>
</p:selectOneMenu>
<p:outputLabel value="Subcategoria" for="subcategoria"/>
<p:selectOneMenu id="subcategoria" value="#{cadastroProdutoBean.produto.categoria}">
<f:selectItem itemLabel="Selecione a subcategoria"/>
<f:selectItems value="#{cadastroProdutoBean.subcategorias}" var="subcategoria"
itemValue="#{subcategoria}" itemLabel="#{subcategoria.descricao}"/>
</p:selectOneMenu>
<p:outputLabel value="Valor unitário" for="valorUnitario"/>
<p:inputText id="valorUnitario" size="10" maxlength="10" styleClass="moeda"
value="#{cadastroProdutoBean.produto.valorUnitario}">
<f:convertNumber maxFractionDigits="2" minFractionDigits="2"/>
</p:inputText>
<p:outputLabel value="Estoque" for="estoque"/>
<p:inputText id="estoque" size="10" maxlength="5"
value="#{cadastroProdutoBean.produto.quantidadeEstoque}"/>
</p:panelGrid>
</h:form>
cadastroProdutoBean.java
@Named
@ViewScoped
public class CadastroProdutoBean implements Serializable {
public static final long serialVersionUID = 0L;
@Inject
private Categorias categorias;
@Inject
private CadastroProdutoService cadastroProdutoService;
private List<Categoria> categoriasRaizes;
private List<Categoria> subcategorias;
private Produto produto;
private Categoria categoriaPai;
public CadastroProdutoBean() {
limpar();
}
//@PostConstruct
public void inicializar() {
System.out.println("Inicialinado....");
if (FacesUtil.isNotPostback()) {
categoriasRaizes = categorias.raizes();
if (this.categoriaPai != null) {
carregarSubCategorias();
}
}
}
public void carregarSubCategorias() {
subcategorias = categorias.subcategoriasDe(categoriaPai);
}
private void limpar() {
this.produto = new Produto();
categoriaPai = null;
subcategorias = new ArrayList<>();
}
public void salvar() {
this.produto = cadastroProdutoService.salvar(this.produto);
limpar();
FacesUtil.addInfoMessage("Produto Salvo com sucesso!");
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
if (this.produto != null) {
this.categoriaPai = this.produto.getCategoria().getCategoriaPai();
}
}
public List<Categoria> getCategoriasRaizes() {
return categoriasRaizes;
}
@NotNull
public Categoria getCategoriaPai() {
return categoriaPai;
}
public void setCategoriaPai(Categoria categoriaPai) {
this.categoriaPai = categoriaPai;
}
public List<Categoria> getSubcategorias() {
return subcategorias;
}
public void setSubcategorias(List<Categoria> subcategorias) {
this.subcategorias = subcategorias;
}
public boolean isEditando() {
return this.produto != null && this.produto.getId() != null;
}
}
Java product.
@Entity
@Table(name = "produto")
public class Produto implements Serializable {
private static final long serialVersionUID = 0L;
private Long id;
private String nome;
private String sku;
private BigDecimal valorUnitario;
private Integer quantidadeEstoque;
private Categoria categoria;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotBlank
@Size(max = 80)
@Column(nullable = false, length = 80)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@NotBlank
@SKU
@Column(nullable = false, length = 20, unique = true)
public String getSku() {
return sku;
}
public void setSku(String sku) {
this.sku = sku == null ? null : sku.toUpperCase();
}
@NotNull(message = "é obrigatório")
@Column(name = "valor_unitario", nullable = false, precision = 10, scale = 2)
public BigDecimal getValorUnitario() {
return valorUnitario;
}
public void setValorUnitario(BigDecimal valorUnitario) {
this.valorUnitario = valorUnitario;
}
@NotNull
@Min(0)
@Max(value = 9999, message = "Tem um valor muito alto")
@Column(name = "quantidade_estoque", nullable = false, length = 5)
public Integer getQuantidadeEstoque() {
return quantidadeEstoque;
}
public void setQuantidadeEstoque(Integer quantidadeEstoque) {
this.quantidadeEstoque = quantidadeEstoque;
}
@NotNull
@ManyToOne
@JoinColumn(name = "categoria_id", nullable = false)
public Categoria getCategoria() {
return categoria;
}
public void setCategoria(Categoria categoria) {
this.categoria = categoria;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Produto other = (Produto) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
return true;
}
public void baixarEstoque(Integer quantidade) {
int novaQuantidade = this.getQuantidadeEstoque() - quantidade;
if (novaQuantidade < 0) {
throw new NegocioException("Não há disponibilidade no estoque de "
+ quantidade + " itens do produto " + this.getSku() + ".");
}
this.setQuantidadeEstoque(novaQuantidade);
}
public void adicionarEstoque(Integer quantidade) {
this.setQuantidadeEstoque(getQuantidadeEstoque() + quantidade);
}
repositorio categories.java
public class Categorias implements Serializable {
public static final long serialVersionUID = 0L;
@Inject
private EntityManager manager;
public Categoria porId(Long id) {
return manager.find(Categoria.class, id);
}
public List<Categoria> raizes() {
return manager.createQuery("from Categoria where categoriaPai is null",
Categoria.class).getResultList();
}
public List<Categoria> subcategoriasDe(Categoria categoriaPai) {
return manager.createQuery("from Categoria where categoriaPai = :raiz",
Categoria.class).setParameter("raiz", categoriaPai).getResultList();
}
categorieConverter.java
@FacesConverter(forClass = Categoria.class)
public class CategoriaConverter implements Converter {
// @Inject
private Categorias categorias;
public CategoriaConverter() {
categorias = CDIServiceLocator.getBean(Categorias.class);
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Categoria retorno = null;
if (value != null) {
Long id = new Long(value);
retorno = categorias.porId(id);
}
return retorno;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null) {
return ((Categoria) value).getId().toString();
}
return "";
}
category.java model
@Entity
@Table(name = "categoria")
public class Categoria implements Serializable {
private static final long serialVersionUID = 0L;
private Long id;
private String descricao;
private Categoria categoriaPai;
private List<Categoria> subcategorias = new ArrayList<>();
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(nullable = false, length = 60)
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
@ManyToOne
@JoinColumn(name = "categoria_pai_id")
public Categoria getCategoriaPai() {
return categoriaPai;
}
public void setCategoriaPai(Categoria categoriaPai) {
this.categoriaPai = categoriaPai;
}
@OneToMany(mappedBy = "categoriaPai", cascade = CascadeType.ALL)
public List<Categoria> getSubcategorias() {
return subcategorias;
}
public void setSubcategorias(List<Categoria> subcategorias) {
this.subcategorias = subcategorias;
}
@Override
public int hashCode() {
int hash = 3;
hash = 29 * hash + Objects.hashCode(this.id);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Categoria other = (Categoria) obj;
if (!Objects.equals(this.id, other.id)) {
return false;
}
return true;
}
Registration products service.java
public class CadastroProdutoService implements Serializable {
private static final long serialVersionUID = 0L;
@Inject
private Produtos produtos;
@Transactional
public Produto salvar(Produto produto) {
Produto produtoExistente = produtos.porSku(produto.getSku());
if(produtoExistente != null && !produtoExistente.equals(produto)){
throw new NegocioException("Já existe um produto com sku informado.");
}
return produtos.guardar(produto);
}
Repositório Produtos
public class Produtos implements Serializable {
private static final long serialVersionUID = 0L;
@Inject
private EntityManager manager;
public Produto guardar(Produto produto) {
return manager.merge(produto);
}
@Transactional
public void remover(Produto produto) {
try {
produto = porId(produto.getId());
manager.remove(produto);
manager.flush();
} catch (PersistenceException e) {
throw new NegocioException("Produto não pode ser excluido");
}
}
public Produto porSku(String sku) {
try {
return manager.createQuery("from Produto where upper(sku) = :sku", Produto.class)
.setParameter("sku", sku.toUpperCase()).getSingleResult();
} catch (NoResultException e) {
return null;
}
}
// @SuppressWarnings("uncheked") quando estiver reclamando codigo em "amarelo" retorna lista tipada order
public List<Produto> filtrados(ProdutoFilter filtro) {
Session session = manager.unwrap(Session.class);
Criteria criteria = session.createCriteria(Produto.class);
if (StringUtils.isNotBlank(filtro.getSku())) {
criteria.add(Restrictions.eq("sku", filtro.getSku()));
}
if (StringUtils.isNotBlank(filtro.getNome())) {
criteria.add(Restrictions.ilike("nome", filtro.getNome(), MatchMode.ANYWHERE));//where queoque apareça antes ou depois "%joao%" //wherre nome like'%joao%'
}
return criteria.addOrder(Order.asc("nome")).list();
}
public Produto porId(Long id) {
return manager.find(Produto.class, id);
}
public List<Produto> porNome(String nome) {
return this.manager.createQuery("from Produto where upper(nome) like :nome", Produto.class)
.setParameter("nome", nome.toUpperCase() + "%").getResultList();
}
I don’t think so. posted repository code and service class Product take a look, null return to product
– Adriano
the problem was in the initialize method was worth Thank you, for the attention
– Adriano
Oh yes. It was commented the Postconstruct note before then I didn’t even think about this method. I’m glad it worked then :)
– Giuliana Bezerra