Primefaces selectOneMenu-Wandler genannt, aber nicht arbeiten

Habe ich mir angeschaut, die anderen Fragen diese und diese, etc, das problem ist, dass mein konvertieren wird aufgerufen, aber die Werte selectOneMenu nicht ändern. Meine entity-Klasse generiert wird, und hat gleich auch als hashCode, und ich möchte nicht, irgendetwas zu ändern - wenn es sich wieder regeneriert hat, dann sind alle änderungen verloren (Die Arbeit um zu ändern toString-Methode des entity-Klasse).

XHTML-code snipped:

<p:selectOneMenu id="defid" 
                 value="#{abcController.selected.defid}"
                 converter="defConverter">

Den Konverter:

@FacesConverter("defConverter")
public class DefConverter implements Converter
{
    private static final Logger LOG = Logger.getLogger(DefConverter.class.getName());
    @EJB
    private DefFacade defFacade;

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string)
    {
        LOG.info("getAsObject: " + string);
        try
        {
            return defFacade.findWithNFieldsWithValue("name", string, "=").get(0);
        }
        catch (Exception ex)
        {
            LOG.log(Level.SEVERE, "Error while fetching Def for " + string, ex);
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object obj)
    {
        LOG.info("getAsString obj class: " + obj.getClass().getName());
        if(obj instanceof Def)
        {
            Def def = (Def)obj;
            LOG.info("getAsString def name: " + def.getName());
            return def.getName();
        }
        else
        {
            StringBuilder sbError = new StringBuilder("The object of class ");
            sbError.append(obj.getClass().getName()).append(" is not of Def");
            throw new ClassCastException(sbError.toString());
        }
    }
}

Die entity-Klasse geschnippelt (erzeugt):

...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "defid")
private Long defid;
...

@Override
public int hashCode()
{
    int hash = 0;
    hash += (defid != null ? defid.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object)
{
    //TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Def))
    {
        return false;
    }
    Def other = (Def) object;
    if ((this.defid == null && other.defid != null) || (this.defid != null && !this.defid.equals(other.defid)))
    {
        return false;
    }
    return true;
}

Wenn die Seite lädt, ich kann sehen, dass die log-Anweisungen wie folgt:

getAsString obj class: com.xyz.Def
getAsString def name: Name 1
getAsString obj class: com.xyz.Def
getAsString def name: Name 2
getAsString obj class: com.xyz.Def
getAsString def name: Name 3

Damit der Konverter wird aufgerufen und gibt die richtigen Werte, aber auf der Seite ist es noch com.xyz.Def[ defid=1 ] (Drop-down und normal)

InformationsquelleAutor TungstenX | 2015-02-26

Schreibe einen Kommentar