Hi All,

After a couple of days I can't seem to figure this validation problem out. I
have a basic JSP form (create.jsp) with a textfield (with validation) and a
select list (WITHOUT validation). When I submit the form to trigger a
validation failure on purpose, the text field is validated correctly and the
user input is still present, however, the select list disappears below it
and the following error is given:

ERROR [[default]] Servlet.service() for servlet default threw exception
tag 'select', field 'list', name 'catID': The requested list key
'categories' could not be resolved as a collection/array/map/enumeration/it
erator type. Example: people or people.{name} - [unknown location]

I've read about similar problems and they say to initialize the collections
in the prepare(). I did that and I'm still getting the problem. Another
solution I've heard was to put the Collection in the session. This doesn't
seem like a scalable solution for applications that are deployed in a
session replicated enviornement like clustering. Please tell me that putting
the list in the seseion isn't the only work around?

-----------------------------------------------------------------------------------------------------------
Action Code:
------------------------------------------------------------------------------------------------------------
public class CreateTicket extends ActionSupport implements Preparable {

    private Map categories;

    public Map getCategories() {
        return categories;
    }

    public void setCategories(Map categories) {
        this.categories = categories;
    }

    public String execute() throws Exception {
        this.prepare();
        return SUCCESS;
    }

    public void prepare() throws Exception {
        categories = new HashMap();
        categories.put(1, "test");
        categories.put(2, "test2");
        categories.put(3, "test3");
    }
}


public class HelloWorld extends ActionSupport {

    public static final String MESSAGE = "Struts is up and running ...";
    private String name;
    private Integer catID;

    public Integer getCatID() {
        return catID;
    }

    public void setCatID(Integer catID) {
        this.catID = catID;
    }

    public String execute() throws Exception {

        setMessage(MESSAGE + " " + getName());

        return SUCCESS;

    }

    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

----------------------------------------------------------------------------------------------------------
/tutorial/create.jsp Code:
----------------------------------------------------------------------------------------------------------
<s:form action="HelloWorld">
<s:textfield name="name" label="Your name" size="50"/>
<s:select name="catID" label="Categories" list="categories"/>
<s:submit/>
</s:form>

----------------------------------------------------------------------------------------------------------
struts.xml Code:
----------------------------------------------------------------------------------------------------------
<struts>
    <constant name="struts.action.extension" value="" />
    <constant name="struts.devMode" value="true" />

    <package name="default" extends="struts-default">
        <action name="create" class="tutorial.CreateTicket">
            <result>/ticket/create.jsp</result>
        </action>
        <action name="HelloWorld" class="tutorial.HelloWorld">
            <result name="success">/ticket/createconfirm.jsp</result>
            <result name="input">/ticket/create.jsp</result>
        </action>
    </package>
</struts>

----------------------------------------------------------------------------------------------------------
HelloWorld-validaiton.xml:
----------------------------------------------------------------------------------------------------------
<validators>
    <validator type="stringlength">
        <param name="fieldName">name</param>
        <param name="minLength">10</param>
        <param name="maxLength">10</param>
        <param name="trim">true</param>
        <message>Your name needs to be 10 characters long</message>
    </validator>
</validators>

Reply via email to