Retorno nulo ao cadastrar novo produto, mas quando edito consigo salvar não dar nenhum erro

0 respostas
jsfhibernatejava
A

Olá pessoal estou com problemas aplicação jsf, cdi, quando cadastro novo produto dar retorno nulo, mas quando edito faz edição normalmente. dar erro

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

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

}

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

repositorio categorias.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();
}

categoriaConverter.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 "";
}

categoria.java modelo

@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;
}
Criado 28 de agosto de 2016
Respostas 0
Participantes 1