Boa tarde a todos,
No meu projeto tenho um relacionamento com uma tabela associativa com atributos e estou com problemas para fazer o convert para o selectOneMenu. Vou colocar aqui os códigos das classes, alguém poderia me ajudar a encontrar a solução? tentei varios converts mas nenhum atendeu ao meu caso…
A Tabela Artesao e a Tabela MateriaPrima migram suas chaves primárias para a tabela ArtesaoMaterial que possui dois atributos.
cadastroArtesao.xhtml
<p:outputLabel value="Matéria Prima" for="matprima" />
<p:selectOneMenu id="matprima" value="#{artesaobean.materiasPrimasSelect}" >
<f:selectItems value="#{materiaprimabean.materias}"/>
<f:converter converterId="materiaPrimaConverter"/>
</p:selectOneMenu>
Mapeamento na Tabela Artesão
@Entity
@Table(name = "artesao")
public class Artesao implements Serializable{
// ...ATRIBUTOS
@OneToMany(fetch=FetchType.LAZY, mappedBy="pk.artesao")
private List <ArtesaoMaterial> materiasprimas;
//...GETTERS AND SETTERS
public List<ArtesaoMaterial> getMateriasPrimas() {
if(materiasprimas == null)
materiasprimas = new ArrayList<ArtesaoMaterial>();
return materiasprimas;
}
public void setMateriasPrimas(List<ArtesaoMaterial> materiasprimas) {
this.materiasprimas = materiasprimas;
}
Mapeamento na Tabela MateriaPrima
@Entity
public class MateriaPrima implements Serializable{
//...ATRIBUTOS
@OneToMany(fetch=FetchType.LAZY, mappedBy="pk.materiaPrima")
private List <ArtesaoMaterial> artesoes;
//...GETTERS AND SETTERS
public List<ArtesaoMaterial> getArtesoes() {
return artesoes;
}
public void setArtesoes(List<ArtesaoMaterial> artesoes) {
this.artesoes = artesoes;
}
//HASH CODE AND EQUALS
Mapeamento da Tabela Associativa ArtesaoMaterial
@Entity
@Table(name="ArtesaoMaterial")
@AssociationOverrides({
@AssociationOverride(name = "idArtesao",
joinColumns = @JoinColumn(name = "idArtesao", insertable = false, updatable = false)),
@AssociationOverride(name = "idMateriaPrima",
joinColumns = @JoinColumn(name = "idMateriaPrima", insertable = false, updatable = false))})
public class ArtesaoMaterial implements Serializable{
@EmbeddedId
private ArtesaoMaterialId pk = new ArtesaoMaterialId();
//...ATRIBUTOS GETTERS AND SETTERS
MateriaPrimaBean.java
@ManagedBean(name = "materiaprimabean")
@ViewScoped
public class MateriaPrimaBean {
private Map<String, MateriaPrima> materias;
private MateriaPrimaDAO materiaPrimaDAO;
public MateriaPrimaBean() {
materiaPrimaDAO = new MateriaPrimaDAO();
materias = new HashMap<String, MateriaPrima>();
for(MateriaPrima mat : materiaPrimaDAO.findAll()) {
materias.put(mat.getNomeMateriaPrima(), mat);
}
}
public Map<String, MateriaPrima> getMaterias() {
return materias;
}
public void setMaterias(Map<String, MateriaPrima> materias) {
this.materias = materias;
}
}
MateriaPrimaConverter.java
@FacesConverter(value = "materiaPrimaConverter" )
public class MateriaPrimaConverter implements Converter {
@Override
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
if(value != null) {
return this.getAttributesFrom(component).get(value);
}
return null;
}
@Override
public String getAsString(FacesContext ctx, UIComponent component, Object value) {
if(value instanceof MateriaPrima) {
MateriaPrima materiaPrima = (MateriaPrima) value;
if(materiaPrima != null && materiaPrima instanceof MateriaPrima && materiaPrima.getIdMateriaPrima() != null) {
component.getAttributes().put(materiaPrima.getIdMateriaPrima().toString(), materiaPrima);
return materiaPrima.getIdMateriaPrima().toString();
}
}
return "";
}
protected void addAttribute(UIComponent component, MateriaPrima o) {
//String key = o.getMateriaPrima().getIdMateriaPrima().toString();
String key = o.getIdMateriaPrima().toString();
this.getAttributesFrom(component).put(key, o);
}
protected Map<String, Object> getAttributesFrom(UIComponent component) {
return component.getAttributes();
}
}
O erro que é gerado é este…
SEVERE: javax.faces.component.UpdateModelException: javax.el.ELException: /cadastroArtesao.xhtml @303,85 value="#{artesaobean.materiasPrimasSelect}": Cannot convert sedrap.model.MateriaPrima@20 of type class sedrap.model.MateriaPrima to interface java.util.List
O SelectCheckBoxMenu funciona perfeitamente, mas eu não posso deixar marcar mais de uma MatériaPrima… Sabe dizer também pq com o SelectCheckBoxMenu funciona?
desde já agradeço qualquer ajuda.