Primefaces selectOneMenu converter called but not working
The converter seems to be working, but you didn't post the whole <p:selectOneMenu>
code, in particular <f:selectItems>
. It should look something like this
<p:selectOneMenu id="defid"
value="#{abcController.selected.defid}"
converter="defConverter">
<f:selectItems value="#{abcController.defs}" var="def"
itemLabel="#{def.name}" itemValue="#{def.defId}" />
</p:selectOneMenu>
itemLabel
is responsible for printing displayed values.
TungstenX
I'm a Java developer interested in most things technological. I'm also running an Ubuntu 14.04.2 server, mostly for myself. I also got fed up with Windows 10 so I've switch over to Ubuntu 14.04 desktop for my laptop. I do some woodwork as a hobby. SOreadytohelp Where do I begin? Ever since I've joined in Jan 2011, Stack Overflow helped me in my everyday quest to become better at what I do and love! Thank you a 10m!
Updated on August 10, 2022Comments
-
TungstenX over 1 year
I've looked at the other questions this and this, etc, the problem is that my convert gets called but the values of selectOneMenu doesn't change. My entity class is generated, and has equals as well as hashCode and I would like not to change anything in it - if it gets regenerated then all changes will be lost (The work around is to change toString of the entity class).
The XHTML code snipped:
<p:selectOneMenu id="defid" value="#{abcController.selected.defid}" converter="defConverter">
The Converter:
@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()); } } }
The entity class snipped (this is generated):
... @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; }
When the page loads, I can see the log statements as follow:
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
Thus the converter gets called and returns the correct values but on the page it is still com.xyz.Def[ defid=1 ] (Drop down and normal)
-
TungstenX about 9 yearsThank you I was missing the itemLabel attribute in the selectItems tag.