Ajax Richfaces 3.3/JBoss Seam 2.2。动态加载多个组合框

Ajax Richfaces 3.3/JBoss Seam 2.2。动态加载多个组合框,ajax,combobox,richfaces,Ajax,Combobox,Richfaces,我有三个组合框。第一个由值填充。当我从中选择一个值时,第二个值必须更新。之后,当我从第二个组合中选择一个值时,应该填充第三个组合。我知道这已经被传达了,但是有两个组合。如果超过两个,它就不起作用了。你能告诉我什么地方我做得不好吗 以下是视图: <h:form> <h:panelGrid columns="2"> <h:outputText value="Choose the produce type:"/>

我有三个组合框。第一个由值填充。当我从中选择一个值时,第二个值必须更新。之后,当我从第二个组合中选择一个值时,应该填充第三个组合。我知道这已经被传达了,但是有两个组合。如果超过两个,它就不起作用了。你能告诉我什么地方我做得不好吗

以下是视图:

<h:form>
    <h:panelGrid columns="2">        
        <h:outputText value="Choose the produce type:"/>

        <h:selectOneMenu id="firstList"
                            value="#{userBean.firstItem}"                
                            valueChangeListener="#{userBean.valueChanged}">
            <f:selectItems value="#{userBean.firstList}"
                           var="element"
                           itemLabel="#{element.label}"
                           itemValue="#{element.value}" />
                <a4j:support reRender="outputPanel"
                             event="onchange"                                                                  
                             ajaxSingle="true"
                             bypassUpdates="false" />                
        </h:selectOneMenu>

        <a4j:outputPanel id="outputPanel">
            <h:selectOneMenu value="#{userBean.secondItem}"                
                             valueChangeListener="#{userBean.valueChanged}">
            <f:selectItems value="#{userBean.secondList}"
                           var="element"
                           itemLabel="#{element.label}"
                           itemValue="#{element.value}" />                    
                    <a4j:support reRender="outputPanel"
                             event="onchange"                                                                  
                             ajaxSingle="true"
                             bypassUpdates="false" />                                                 
            </h:selectOneMenu>

            <h:selectOneMenu value="#{userBean.thirdItem}"                
                             valueChangeListener="#{userBean.valueChanged}">
            <f:selectItems value="#{userBean.thirdList}"
                           var="element"
                           itemLabel="#{element.label}"
                           itemValue="#{element.value}" />                                                 
            </h:selectOneMenu>                
        </a4j:outputPanel>

    </h:panelGrid>
</h:form>

这就是Bean(这是一个没有任何意义的示例代码):

@Name(“userBean”)
公共类用户bean
{
@记录器私有日志;
@在状态消息中,状态消息;
私有字符串firstItem=“”;
私有字符串secondItem=“”;
私有字符串thirdItem=“”;
public List firstList=new ArrayList();
public List secondList=new ArrayList();
public List thirdList=new ArrayList();
私有静态最终字符串[]水果={“香蕉”、“蔓越莓”、“蓝莓”、“橙子”};
私有静态最后字符串[]蔬菜={“土豆”、“花椰菜”、“大蒜”、“胡萝卜”};
私有静态最终字符串[]GIRLS={“Victoria”、“Nana”、“Etc…”;
公共用户bean(){
SelectItem项目=新的SelectItem(“水果”、“水果”);
第一个列表。添加(项目);
项目=新选择项目(“蔬菜”、“蔬菜”);
第一个列表。添加(项目);
项目=新选择项目(“女孩”、“女孩”);
第一个列表。添加(项目);
for(int i=0;i
问题是,当我从第二个组合框中选择一个值(其中的值是动态加载的)时,页面被重新加载(而不是执行ajax请求),我有一个异常:

请求处理期间出现异常: 由javax.servlet.ServletException引起,消息为:“java.util.NoSuchElementException”

第二个列表从第一个列表成功更新,但之后出现问题

提前谢谢!
干杯!

确保您的bean的范围比请求的范围更广,比如会话范围。看起来您使用的是JSF 1.2,在这种情况下,RichFaces有一个
标记组件来将托管bean的范围从请求提升到视图(在幕后使用会话变量)。此选项可能是您所需要的。有两种方法可以实现它

  • 使用标记组件。这将使bean仅具有此页面的“查看范围”

    <a4j:keepAlive bean="userBean" />
    <h:form>
        <h:panelGrid columns="2">
        <!-- the rest of your code... -->
    

  • 注意:要使用这个标记(作为组件或注释),bean必须有请求范围。

    嗨,Luiggi,谢谢你的回复!我不知道有这样的标记存在。我把它放在表单对象之前,它就工作了。有趣的是,bean在对话范围内(Seam对话)它不起作用。只有在贴上标签后它才起作用。我会读到这个标签,但是你能回答我吗,为什么在对话状态下它不起作用?非常感谢!!!这个问题困扰了我一个星期。干杯!我从这个开始,在keepAlive标签的范围或使用上我没有看到任何区别。@niki4ko你应该检查一下。
    <a4j:keepAlive bean="userBean" />
    <h:form>
        <h:panelGrid columns="2">
        <!-- the rest of your code... -->
    
    @Name("userBean")
    @KeepAlive
    public class UserBean {
        //your managed bean code...
    }