I’m implementing a webapp using Jsf 2.0 and Primefaces 3.2.
I’ve noticed this unexpected behavoiur: I have a selectOneMenu and a commandButton, as below
<p:selectOneMenu id="selsel" value="#{bean.myObj}">
<f:selectItems value="#{bean.myObjList}" />
</p:selectOneMenu>
<p:commandButton id="btnid" value="Ok" actionListener="#{bean.updateSelectValues()}" />
What happens is that if myObj is not a String, the updateSelectValues method is not called. I can’t see any exception or error at all, it’s just not called. Here’s the backing bean:
private List<MyObj> myObjList;
private MyObj myObj;
// getters and setters
public void updateSelectValues() {
System.out.println(this.myObj);
}
The code for myObj:
public class MyObj implements Serializable {
private static final long serialVersionUID = 1L;
private String param1;
private int param2;
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("MyObj [param1=");
builder.append(this.param1);
builder.append(", param2=");
builder.append(this.param2);
builder.append("]");
return builder.toString();
}
}
That’s because HTML and HTTP does not understand Java objects. All Java objects are converted to
Stringwhen HTML is to be produced by JSF. All HTTP request parameters which areStringare supposed to be converted back to Java object when the submitted form data is to be processed by JSF.As to your concrete problem, if you have added a
<h:message>,<h:messages>or the PrimeFaces equivalent to the form (and also updated it on ajax submits), then you should have noticed a conversion error for “null converter”. Also, if you have paid attention to the server log, you should also have seen a warning about an unhandled message.You need to create a custom
Converterwhich converts betweenMyObjand its uniqueStringrepresentation. For example:Usually those objects are already stored in some database or mapping by their ID. You then use exactly that ID as unique
Stringrepresentation.