在ui:repeat中使用inputText来更新值的ArrayList是行不通的

Kis*_*ash 3 jsf jsf-2

作为Post的标题.我试图从h:inputText内部更新ArrayList的值ui:repeat,这是行不通的.
请参阅以下模拟以获得进一步理解:

我有一个POJO类如下:

public class User implements Serializable{
    private String name;
    private List<String> emails;

    public User(String name, List<String> emails) {
        super();
        this.name = name;
        this.emails = emails;
    }
    //Setters Getters
}
Run Code Online (Sandbox Code Playgroud)

在我的经理中,我创建了用户POJOS列表:

@ManagedBean
@ViewScoped
public class UserManager implements Serializable {
    private List<User> userList;
    public UserManager() {
        userList = new ArrayList<User>();
        ArrayList<String> emails= new ArrayList<String>();

        emails.add("user1.1@mail.com");
        emails.add("user1.2@mail.com");
        userList.add(new User("User1", (List<String>) emails.clone()));

        emails.clear();
        emails.add("user2.1@mail.com");
        emails.add("user2.2@mail.com");
        userList.add(new User("User2", (List<String>) emails.clone()));
    }
    public void action(){
    for(User u : userList){
        System.out.println(u);
    }
}
    //Setters Getters
}
Run Code Online (Sandbox Code Playgroud)

现在在我的Facelet中我ui:repeat用于将数据加载h:inputText到表中,以便用户可以编辑和更改值.Facelet代码:

<h:form id="userForm">
    <table border="1">
        <ui:repeat var="user" value="#{userManager.userList}">
            <tr>
                <td><h:inputText value="#{user.name}"/> </td>

                <ui:repeat var="email" value="#{user.emails}">
                    <td><h:inputText value="#{email}"/> </td>
                </ui:repeat>
            </tr>
        </ui:repeat>
    </table>

    <h:commandButton value="Save" action="#{userManager.action}">
        <f:ajax execute="@form @this"/>
    </h:commandButton>
</h:form>
Run Code Online (Sandbox Code Playgroud)

编辑时,上面的方法工作正常,#{user.name}但不能正常工作#{email}.
我可以假设它的工作#{user.name}因为name有setter和getter方法.
那么我该如何更新emails列表对象呢.
我的POJO设计很差吗?或者使用它是一个坏主意ui:repeat
我怎样才能做到这一点?

注意:我目前的Mojarra版本是2.1

Val*_*min 5

正如BalusC 在此 报道的那样String是不可改变的.

使用该varStatus属性可以通过索引直接访问列表成员.

<ui:repeat varStatus="loop" value="#{user.emails}">
    <td><h:inputText value="#{user.emails[loop.index]}"/> </td>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

使用BigDecimals:

<ui:repeat varStatus="loop" value="#{user.numbers}">
    <td><h:inputText value="#{user.numbers[loop.index]}" converter="javax.faces.BigDecimal"/> </td>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)