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

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