在primefaces“selectOneMenu”中使用ajax的问题

时间:2014-01-21 14:51:20

标签: ajax jsf netbeans primefaces entity

的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来获取它。

3 个答案:

答案 0 :(得分:4)

首先,您的<f:selectItem itemValue>是错误的。它应该代表与<p:selectOneMenu value>完全相同的类型,因此Area。将itemValue="#{area.id}"替换为itemValue="#{area}"。你确实需要一个Converter

关于转换器的问题,

  

getAsObject有问题,我把这个值作为id,但不能从中获取实体。 Normaly我会使用AreaFacade.find(id),但我无法使用@EJB来获取它。

你有两个选择:

  1. 将其设为@ManagedBean @RequestScoped而不是@FacesConverter,并将其引用为converter="#{areaConverter}"而不是converter="areaConverter"

  2. 安装OmniFaces&gt; = 1.6。它为@EJB内的@FacesConverter添加了完全透明的支持,无需任何其他配置或注释。

  3. 如果您仍然使用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。

Omnifaces select item converter

答案 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>