1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema com Converter JSF e Primefaces

Estou com o seguinte problema: tenho esse p:selectOneMenu

<p:selectOneMenu id="acr" value="#{produtoAcrescimoMB.acrescimo}" converter="entityConverter"> <f:selectItem itemLabel="Selecione o Acréscimo" noSelectionOption="true"/> <f:selectItems value="#{produtoAcrescimoMB.acrescimos}" /> <p:ajax update="@all" listener="#{produtoAcrescimoMB.carregaProdutos}"></p:ajax> </p:selectOneMenu>

Quando seleciono um item no mesmo dá o erro: "Acrescimo: Erro de validação: o valor não é válidoAcrescimo: Erro de validação: o valor não é válido".

Debuguei a minha entidade Acrescimo e verifiquei que no método equals o 'this' está null. Imagino que seja esse o problema mas não tenho ideia de como resolver. Segue abaixo o converter e o código da entidade:

package br.com.tcf.coverters;

import java.lang.reflect.Field;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.Id;

@FacesConverter("entityConverter")  
public class EntityConverter implements Converter {  

    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {  
        if (value != null) {  
            System.out.println("EntityConverter: "+component.getAttributes().get(value));
            return component.getAttributes().get(value);  
        }  
        return null;  
    }  

    public String getAsString(FacesContext ctx, UIComponent component, Object obj) {  
        if (obj != null && !"".equals(obj)) {  
            String id;  
            try {  
                System.out.println("AQUI: "+this.getId(getClazz(ctx, component), obj));
                id = this.getId(getClazz(ctx, component), obj);  
                if (id == null){  
                    id = "";  
                }  
                id = id.trim();  
                component.getAttributes().put(id, getClazz(ctx, component).cast(obj));  
                return id;  
            } catch (SecurityException e) {  
                e.printStackTrace(); // seu log aqui  
            } catch (IllegalArgumentException e) {  
                e.printStackTrace(); // seu log aqui  
            } catch (NoSuchFieldException e) {  
                e.printStackTrace(); // seu log aqui  
            } catch (IllegalAccessException e) {  
                e.printStackTrace(); // seu log aqui  
            }  
        }  
        return null;  
    }  

    private Class<?> getClazz(FacesContext facesContext, UIComponent component) {  
        return component.getValueExpression("value").getType(facesContext.getELContext());  
    }  

    public String getId(Class<?> clazz, Object obj) throws SecurityException, NoSuchFieldException, 
                                                                              IllegalArgumentException, IllegalAccessException {  
        for (Field field : clazz.getDeclaredFields()) {  
            if ((field.getAnnotation(Id.class)) != null) {  
                Field privateField = clazz.getDeclaredField(field.getName());  
                privateField.setAccessible(true);  
                if (privateField.get(clazz.cast(obj)) != null) {  
                    return (String)field.getType()  
                            .cast(privateField.get(clazz.cast(obj))).toString();  
                } else {  
                    return null;  
                }  
            }  
        }  
        return null;  
    }  
}
package br.com.tcf.entidades;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@Entity
public class Acrescimo {
    @Id
    @GeneratedValue
    private Integer id_acrescimo;

    private String nm_acrescimo;
    private String desc_acrescimo;
    private Boolean sn_ativo;
    private Double vl_acrescimo;

    @ManyToMany(mappedBy="acrescimos")
    private List<Produto> produtos = new ArrayList<Produto>();

    @OneToMany(mappedBy="acrescimo", cascade=javax.persistence.CascadeType.ALL)
    private List<VigenciaAcrescimo> vigencias = new ArrayList<VigenciaAcrescimo>();

    @ManyToOne
    @JoinColumn(name="id_cardapio")
    private Cardapio cardapio;

    //GETTERS AND SETTERS

    @Override
    public String toString() {
        return this.nm_acrescimo;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((id_acrescimo == null) ? 0 : id_acrescimo.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        System.out.println("ACRESCIMO1: "+this);
        System.out.println("ACRESCIMO2: "+obj);

        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Acrescimo)) {
            return false;
        }
        Acrescimo other = (Acrescimo) obj;
        if (id_acrescimo == null) {
            if (other.id_acrescimo != null) {
                return false;
            }
        } else if (!id_acrescimo.equals(other.id_acrescimo)) {
            return false;
        }
        return true;
    }
}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf java-ee primefaces ou faça a sua própria pergunta.