List in struts2 select cant resoved when in use th

2019-06-13 16:23发布

问题:

Hello I use the interface modeldriven in my struts2 application. I have a problem rendering the page because I always get an error:

19 nov. 2013 11:23:12 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: "Servlet.service()" pour la servlet jsp a généré une exception
tag 'select', field 'list': The requested list key 'listeItems' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
        at org.apache.struts2.components.Component.fieldError(Component.java:240)
        at org.apache.struts2.components.Component.findValue(Component.java:333)
        at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:80)

I don't know where is the error so I call distress to the community.

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="false" />
    <constant name="struts.action.extension" value="do" />
    <constant name="struts.custom.i18n.resources" value="com.omb.i18n.StrutsResourceBundle" />
    <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> 
    <constant name="struts.objectFactory.spring.autoWire" value="name" />
    <constant name="struts.i18n.encoding" value="ISO-8859-1" />
    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.configuration.xml.reload" value="false" />
    <constant name="struts.locale" value="fr" />
    <constant name="struts.multipart.maxSize" value="100000000000" />
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>

    <constant name="struts.codebehind.classSuffix" value="Controller"/>
    <constant name="struts.codebehind.action.checkImplementsAction" value="false"/>
    <constant name="struts.codebehind.action.checkAnnotation" value="false"/>
    <constant name="struts.codebehind.action.defaultMethodName" value="index"/>
    <constant name="struts.configuration.classpath.defaultParentPackage" value="rest-default" />

    <package name="default" extends="tiles-default" namespace="/">

        <interceptors>

            <interceptor name="params-filter"
                class="com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor" />

            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception" />
                <interceptor-ref name="alias" />
                <interceptor-ref name="servletConfig" />
                <interceptor-ref name="i18n" />
                <interceptor-ref name="chain" />
                <interceptor-ref name="modelDriven" />
                <interceptor-ref name="fileUpload">
                    <param name="maximumSize">11204928</param>
                </interceptor-ref>
                <interceptor-ref name="staticParams" />
                <interceptor-ref name="conversionError" />
                <interceptor-ref name="params" />
                <interceptor-ref name="prepare" />
                                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation" />
                <interceptor-ref name="workflow" />
            </interceptor-stack>

        </interceptors>

        <default-interceptor-ref name="defaultStack" />

        <global-results>
            <result name="technicalError" type="chain">
                errorAction
            </result>
            <result name="sessionInvalidError" type="tiles">
                sessionInvalid
            </result>
            <result name="blank" type="tiles">blank</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception"
                result="technicalError" />
            <exception-mapping
                exception="com.omb.service.exception.UserSessionInvalidException"
                result="sessionInvalidError" />

        </global-exception-mappings>

    </package>

    <package name="omb" extends="default" namespace="/omb">
        <action name="*Action" class="myAction" method="{1}">
            <result name="success" type="redirectAction">
                <param name="namespace">/omb</param>
                <param name="actionName">displayResult</param>
            </result>
            <result name="error" type="redirectAction">
                <param name="namespace">/error</param>
                <param name="actionName">displayError</param>
            </result>
        </action>
    </package>
</struts>

MyAction.java:

package com.omb.actions;

public class MyAction extends ActionSupport implements ModelDriven<MyModel>{

    private MyModel myModel = new MyModel();

    public MyModel getModel() {
        return myModel;
    }

    public String execute() throws Exception {
        myModel.add(new Item("A", "Item A"));
        myModel.add(new Item("B", "Item B"));
        return SUCCESS;
    }

    public String doAction() {
        // do something
        return "SUCCESS";
    }

    public MyModel getMyModel() {
        return this.myModel;
    }

    public void setMyModel(MyModel myModel) {
        this.myModel = myModel;
    }
}

MyModel.java:

package com.omb.modele;

import java.util.ArrayList;
import java.util.List;

import com.omb.item.Item;

public class MyModel {

    private String idItem;

    private List<Item> listeItems = new ArrayList<Item>();

    public String getIdItem() {
        return this.idItem;
    }

    public void setIdItem(String idItem) {
        this.idItem = idItem;
    }

    public List<Item> getListeItems() {
        return this.listeItems;
    }

    public void setListeItems(List<Item> listeItems) {
        this.listeItems = listeItems;
    }
}

Item.java:

package com.omb.item;

import java.io.Serializable;

public class Item implements Serializable {

    private static final long serialVersionUID = 1L;

    private String id;

    private String label;

    public Item() {
        super();    
    }

    public Item(String id, String label) {
        this.id = id;
        this.label = label;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

JSP file :

<%@ taglib prefix="s" uri="/struts-tags"%>

<table width="100%">

    <tr>
        <td><label><s:property value="%{getText('label')}" /></label></td>
    </tr>
    <tr>
        <td><s:select id="idSelectItem"
                emptyOption="true" list="listeItems" value="idItem"
                listKey="id" listValue="label" />
        </td>
    </tr>

</table>

回答1:

Remove method="{1}" because you don't not use wildcard mapping and your action doesn't have methods other than execute and only this method initializes the list. If the list is not initialized the error like above occur. If you have other methods didn't show there you should implement Preparable for the action and move the code that initializes the list there.

public class MyAction extends ActionSupport implements ModelDriven<MyModel>, Preparable {

  public void prepare() {
    myModel = new MyModel();
    myModel.add(new Item("A", "Item A"));
    myModel.add(new Item("B", "Item B"));
  }
  ...
}