Sim*_*ger 2 converter selectonemenu java-ee-6 jsf-2 drop-down-menu
对于我的项目,我想用h:selectOneMenu实现一个组合框.我读了很多关于如何正确处理selectOneMenu以及如何实现自定义转换器的帖子.组合框应存储来自不同数据库表(名为fk_ID)的ID(长),其中约束已到位.到目前为止,一切似乎都按计划运作.现在我的问题:
列fk_ID是可选的,因此组合框中的第一个选项是f:selectItem,没有标记为"choose ..."的值.当我保存表单并更改值时,一切正常,除非我将其设置为"选择...".我得到的错误是约束完整性违规.
我也发现了问题:转换器按预期返回null,但bean接收Long 0.
XHTML:
<h:selectOneMenu value="#{userBean.selectedModel.fk_id}"
id="combobox">
<f:selectItem itemLabel="choose ..." />
<f:selectItems
value="#{userBean.items}"
var="item"
itemLabel="#{item.value}"
itemValue="#{item.id}"
/>
<f:converter converterId="userConverter" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
自定义转换器:
@FacesConverter(value = "userConverter")
public class UserConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
if (arg2 != null && !arg2.equals("null"))
return Long.valueOf(arg2);
return null;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return String.valueOf(arg2);
}
}
Run Code Online (Sandbox Code Playgroud)
豆(非常短的版本):
@Named(value = "userBean")
public class UserController implements Serializable {
@Getter
@Setter
private UserModel selectedModel;
@Getter
@Setter
private List<UserModel> items;
public void saveModel() {
selectedModel = userService.saveModel(selectedModel);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是fk_id是Long 0,但应该为null.我可以通过写作解决问题
if (selectedModel.getFk_id() == 0)
selectedModel.setFk_id(null);
Run Code Online (Sandbox Code Playgroud)
,但这不是我感到满意的解决方案.
我的问题:为什么值零,该转换器返回时,龙0内部saveModel()方法?
这个转换器是不必要的,没有任何意义(我希望UserConverter
在之间转换,User
而String
不是在Long
和之间转换String
).去掉它.
现在,您需要告诉JSF将空字符串提交的值解释为null
.将以下内容添加到您的web.xml
:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
这应解决大多数容器的问题.但是如果您正在使用Tomcat或它的fork/clone(JBoss AS,WebSphere AS等)和/或容器使用Apache EL解析器实现,那么您还需要将以下参数添加到其VM启动参数:
-Dorg.apache.el.parser.COERCE_TO_ZERO=false
Run Code Online (Sandbox Code Playgroud)
即使您使用原始包装类型作为属性,这也会阻止Apache EL解析器将提交的值强制转换为基元的默认值.
与具体问题无关,你没有组合框.这只是一个简单的下拉列表.组合框是一个可编辑的下拉列表.让你的条款正确;)
归档时间: |
|
查看次数: |
5262 次 |
最近记录: |