проблема преобразования типа коллекции Struts 2 - PullRequest
0 голосов
/ 12 декабря 2010

У меня проблемы с использованием преобразования типов в стойках 2 для преобразования коллекции bean-компонентов.У меня следующий класс действий:

@Validation()
@Conversion()
public class HelloWorldAction extends ActionSupport {


    private List<HelloBean> helloBeans = new ArrayList<HelloBean>();


    public String execute() throws Exception {
        System.out.println(helloBeans);
        return SUCCESS;
    }
    public List<HelloBean> getHelloBeans() {
        return helloBeans;
    }

     @TypeConversion(rule = ConversionRule.COLLECTION, converter = "foo.HelloBean")
    public void setHelloBeans(List<HelloBean> helloBeans) {
        this.helloBeans = helloBeans;
    }

}

и мой класс bean-компонента:

public class HelloBean {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}   

и мой файл JSP:

<s:form action="helloWorld">

    <s:textfield name="helloBeans.name" label="name1"/>
    <s:textfield name="helloBeans.name" label="name2" />
    <s:textfield name="helloBeans.age" label="age1"/>
    <s:textfield name="helloBeans.age" label="age2"/>
        <s:submit />
    </s:form>

Когда процесс был отправлен,распорки всегда дают мне 4 объекта, а не 2 объекта внутри коллекции.Я знаю, что другой обходной путь с использованием индекса в свойстве решит проблему, но для моего случая мне нужно, чтобы коллекция была динамичной.Есть ли способ решить эту проблему?

Я пробовал и другие аннотации:

@Element(value =foo.HelloBean.class )
    @CreateIfNull( value = true )
    @KeyProperty( value = "name" )
    private List<HelloBean> helloBeans = new ArrayList<HelloBean>();

, но ни один из них не работал

1 Ответ

0 голосов
/ 12 декабря 2010

AFAIK вы должны использовать:

    <s:form action="hello-world">
        <s:textfield name="helloBeans[1].name" label="name1"/>
        <s:textfield name="helloBeans[1].age" label="age1"/>
        <s:textfield name="helloBeans[2].name" label="name2" />
        <s:textfield name="helloBeans[2].age" label="age2"/>
        <s:submit />
    </s:form>

Я думаю, что самая большая проблема не в том, что это должно быть сделано таким образом, а в том, что вы думаете, что это означает, что он не может быть динамическим, считайте, что текстовые поля отображаются более-менее (на самом деле меньше, потому что я удалил 'id' и атрибуты 'value'):

<input type="text" name="helloBeans[1].name"/>
<input type="text" name="helloBeans[1].age"/>
... 

Нет причины, по которой вы просто не можете обрабатывать это в вашем jsp динамически, как это делается для проверки представления:

    <h1>Display HelloBeans</h1>
    <table>
        <s:iterator value="helloBeans">
            <tr>
                <td><s:property value="name"/></td>
                <td><s:property value="age"/></td>
            </tr>
        </s:iterator>
    </table>

Или, если ваша проблема на стороне клиента, тогда используйте JavaScript (или, лучше, библиотеку JS, такую ​​как jQuery), чтобы добавить новые текстовые поля в DOM ... и используйте конкатенацию строк для построения правильного OGNL для атрибутов 'name'.

Обратите внимание, если ваше динамическое поведение на стороне сервера в JSP, тогда

<s:property value="#helloBeans.index" /> 

даст вам индекс текущей итерации при использовании внутри тега s: iterator.

...