Olá, estou tentando fazer um selectOneMenu usando primefaces e jsf porém não estou conseguindo salvar o produto que depende da marca. Dá um erro como se o objeto não fosse encontrado ou nulo, porém no form aparece as marcas cadastradas. Acredito que o problema está com o converter.
Entidade Produto:
@Entity
@Table(name = “produto”)
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_PRODUTO")
@SequenceGenerator(name = "SEQ_PRODUTO", sequenceName = "SEQ_PRODUTO")
@Column(name = "produto_id")
private Long id;
@Column(name = "produto_descricao", nullable = false)
private String descricaoProduto;
@Column(name = "produto_valor_custo", nullable = false)
private BigDecimal valorCusto;
@Column(name = "prod_valor_venda", nullable = false)
private BigDecimal valorVenda;
@Column(name = "produto_qt_estoque", nullable = false)
private BigDecimal quantidadeEstoque;
@ManyToOne
@JoinColumn(name = "categoria_produto_id", referencedColumnName = "categoria_produto_id", nullable = false, foreignKey = @ForeignKey(name = "FK_PRODUTO_CATEGORIA"))
private CategoriaProduto categoriaProduto;
@ManyToOne
@JoinColumn(name = "marca_id", referencedColumnName = "marca_id", nullable = false, foreignKey = @ForeignKey(name = "FK_PRODUTO_MARCA"))
private Marca marca;
Form:
<p:outputLabel for="marca" value="Marca: " />
<p:selectOneMenu id="marca"
value="#{marcaControle.entidade}"
filter="true"
filterMatchMode="startsWith"
converter="#{marcaControle.converter().getAsString()}"
>
<f:selectItem itemLabel="Selecione a Marca" itemValue="" />
<f:selectItems value="#{marcaControle.listar}"
var="marc"
itemValue="#{marc.id}"
itemLabel="#{marc.descricaoMarca}" />
</p:selectOneMenu>
Marca Controle:
@Named
@ViewScoped
public class MarcaControle extends AbstractControle<Marca> implements Serializable{
@Inject
private MarcaFacade marcaFacade;
public MarcaControle() {
super(Marca.class);
}
@Override
public AbstractFacade getFacade() {
return marcaFacade;
}
public List<Marca> marcaLikeDescricao(String query){
return marcaFacade.marcaLikeDescricao(query);
}
}
Marca Facade:
public class MarcaFacade extends AbstractFacade<Marca> implements Serializable{
@Inject
private EntityManager em;
public MarcaFacade() {
super(Marca.class);
}
@Override
public EntityManager getEm() {
return em;
}
public List<Marca> marcaLikeDescricao(String query){
Query q = em.createQuery("FROM marca AS m "
+ "WHERE LOWER(m.descricaoMarca) LIKE ('%"+query.toLowerCase()+"%') OR "
+ "LOWER(m.marca_id) LIKE ('%"+query.toLowerCase()+"%') "
+ "ORDER BY m.descricaoMarca");
return q.setMaxResults(20).getResultList();
}
}
Converter Generico:
public class ConverterGenerico implements Converter {
private final AbstractFacade abstractFacade;
public ConverterGenerico(AbstractFacade abstractFacade) {
this.abstractFacade = abstractFacade;
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return abstractFacade.pesquisarId(Long.valueOf(value));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}
Alguém sabe me explicar o porquer ?