的index.xhtml
<p:selectOneMenu id="d2" value="#{mainManageBean.areaSelected}" >
<f:selectItem itemValue="" itemLabel="Select one" />
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area.id}" itemLabel="#{area.name}"/>
<p:ajax event="valueChange" listener="#{mainManageBean.changeAreaSelect()}" update="hi" />
</p:selectOneMenu>
当我的值设置为“mainManageBean.areaSelected”时,其中areaSelected是来自数据库的实体
private Area areaSelected;
ajax事件不起作用, 但当我把它改成像这样的“mainManageBean.s1menu”时,这个“s1menu”只是一个普通的String ajax事件工作正常。
这是什么原因以及如何解决?
这是我的buvers转换器:
@FacesConverter
public class areaConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// here i have problem value is id of entity and have no idea how to get this entity form this id
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
// works fine value = Area entity
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((Area) value).getId());
}
}
}
getAsObject有问题,我把这个值作为id,但不能从中获取实体。 Normaly我会使用AreaFacade.find(id),但我不能使用@EJB来获取它。
答案 0 :(得分:4)
首先,您的<f:selectItem itemValue>
是错误的。它应该代表与<p:selectOneMenu value>
完全相同的类型,因此Area
。将itemValue="#{area.id}"
替换为itemValue="#{area}"
。你确实需要一个Converter
。
关于转换器的问题,
getAsObject有问题,我把这个值作为id,但不能从中获取实体。 Normaly我会使用AreaFacade.find(id),但我无法使用@EJB来获取它。
你有两个选择:
将其设为@ManagedBean @RequestScoped
而不是@FacesConverter
,并将其引用为converter="#{areaConverter}"
而不是converter="areaConverter"
。
安装OmniFaces&gt; = 1.6。它为@EJB
内的@FacesConverter
添加了完全透明的支持,无需任何其他配置或注释。
如果您仍然使用OmniFaces路径,那么您也可以完全丢弃自定义转换器并转到内置SelectItems(Index)Converter
,而无需为itemValue="#{area}"
创建任何自定义转换器。
<p:selectOneMenu ... converter="omnifaces.SelectItemsConverter">
答案 1 :(得分:1)
根据Kuba的评论
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area.id}" itemLabel="#{area.name}"/>
将itemValue更改为
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area}" itemLabel="#{area.name}"/>
<强>更新强>
另一件事可能是转换器。我的建议是使用Onmnifaces的SelectItemsConverter。
答案 2 :(得分:1)
您正在尝试使用ID值设置实体,我假设整数或字符串? ajax不会触发的原因是event="valueChange"
没有发生。如果您尝试在没有ajax的情况下提交此表单,您将获得一个甜蜜的ClassCastException。正如我在评论和Makky的回答中提到的那样,将itemValue更改为:
<p:selectOneMenu id="d2" value="#{mainManageBean.areaSelected}" >
<f:selectItem itemValue="#{null}" itemLabel="Select one" />
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area}" itemLabel="#{area.name}"/>
<p:ajax listener="#{mainManageBean.changeAreaSelect()}" update="hi" process="@this />
</p:selectOneMenu>