null return when registering new product, but when I edit save I do not give any errors

0

Hello everyone, I'm having jsf application problems, cdi, when registering new product give null return, but when edite does edit 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

ProductProfile.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>

cadastroProductoBean.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;
}

}

Product.java

@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);
}

repository 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();
}

categoryConverter.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 template

@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;
}

CadastroProdutoService.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);
}

Products Repository

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();
}
    
asked by anonymous 28.08.2016 / 05:51

2 answers

0

[RESOLVED] The problem was in the boot method not instanciei product, cadastroProductoBean.java

@PostConstruct
public void inicializar() {
System.out.println("Inicialinado....");

if (FacesUtil.isNotPostback()) {
    categoriasRaizes = categorias.raizes();
    if (this.categoriaPai != null) {
        carregarSubCategorias();
    }
}

}

the way it worked out

    @PostConstruct
public void inicializar() {
    System.out.println("Inicialinado....");
  
    
      
        
          
            
 this.produto = new Produto();<<<<< foi este cara aqui
    if (FacesUtil.isNotPostback()) {
        categoriasRaizes = categorias.raizes();
        if (this.categoriaPai != null) {
            carregarSubCategorias();
        }
    }
            
          
        
      
    
  
}
    
31.08.2016 / 04:44
0

The mbean view scope would only call the constructor when you exited the page. So the problem should be in your save method:

this.product = productProfileService.save (this.product) product

Verify that the service is in fact returning a nonzero value.

    
28.08.2016 / 16:13