我正在使用Jsf 2.0和Primefaces 3.2实现一个webapp。
我注意到了这种意想不到的行为:我有一个selectOneMenu
和一个commandButton
,如下所示
<p:selectOneMenu id="selsel" value="#{bean.myObj}">
<f:selectItems value="#{bean.myObjList}" />
</p:selectOneMenu>
<p:commandButton id="btnid" value="Ok" actionListener="#{bean.updateSelectValues()}" />
如果myObj
不是String
,则会调用updateSelectValues
方法。我根本看不到任何异常或错误,它只是没有被调用。这是支持bean:
private List<MyObj> myObjList;
private MyObj myObj;
// getters and setters
public void updateSelectValues() {
System.out.println(this.myObj);
}
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();
}
}
答案 0 :(得分:8)
那是因为HTML和HTTP不了解Java对象。当JSF生成HTML时,所有Java对象都将转换为String
。当要由JSF处理提交的表单数据时,所有String
的HTTP请求参数都应该转换回Java对象。
至于您的具体问题,如果您添加了<h:message>
,<h:messages>
或与表单等效的PrimeFaces(并且还在ajax提交时更新了它),那么您应该注意到转换错误为“空转换器”。此外,如果您已经注意到服务器日志,那么您还应该看到有关未处理消息的警告。
您需要创建一个自定义Converter
,可在MyObj
及其唯一String
表示之间进行转换。例如:
@FacesConverter(forClass=MyObj.class)
public class MyObjConverter implements Converter {
@Override
public String getAsString(FacesContext context, UIComponent component, Object valueToRender) {
// Convert MyObj to its unique String representation.
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
// Convert String to MyObj.
}
}
通常这些对象已经存储在某个数据库中或通过其ID进行映射。然后,您可以使用该ID作为唯一String
表示。