在Request Scoped Bean中将项添加到List

kau*_*edg 2 jsf scope cdi

我有一个支持bean如下:

@Named
@RequestScoped
public class ClientNewBackingBean {

    @Inject
    private ClientFacade facade;
    private Client client;
Run Code Online (Sandbox Code Playgroud)

Client类有一个List<Child> childrenList属性,等等.我能够创建一个新的Client设置时childrenListnew ArrayList().

在视图中,我有一个输入文本字段和一个Add Child按钮.该按钮的属性actionListener=#{clientNewBackingBean.addChild()}实现为:

public void addChild() {

    if(client.getChildrenList() == null) {
        client.getChildrenList(new ArrayList());
    }

    Child c = new Child("John Doe");

    client.getChildrenList().add(c);
}
Run Code Online (Sandbox Code Playgroud)

每次Add Child单击按钮时,都会重新创建bean,并且视图只显示一个John Doe子项(由于它是Request stroped,我相信).除了将bean范围更改为Session之外,还有其他方法可以解决这个问题吗?

Bal*_*usC 9

如果您使用的是标准的JSF bean管理批注@ManagedBean,那么您可以通过将bean放在视图范围中来解决它@ViewScoped.

@ManagedBean
@ViewScoped
public class ClientNewBackingBean implements Serializable {

    @EJB
    private ClientFacade facade;

    // ...
Run Code Online (Sandbox Code Playgroud)

@ViewScoped然而,在CDI中,不存在,最接近的替代方案是@ConversationScoped.你只需要自己启动和停止它.

@Named
@ConversationScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private Conversation conversation;

    // ...

    @PostConstruct
    public void init() {
        conversation.begin();
    }

    public String submitAndNavigate() {
        // ...

        conversation.end();
        return "someOtherPage?faces-redirect=true";
    }

}
Run Code Online (Sandbox Code Playgroud)

您还可以使用CDI扩展MyFaces CODI,它将透明地桥接JSF @ViewScoped注释,以便与@Named以下各项一起正常工作:

@Named
@ViewScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private ClientFacade facade;

    // ...
Run Code Online (Sandbox Code Playgroud)

@ViewAccessScoped只要后续请求引用完全相同的托管bean,CODI替代方法就是使用它,而不管使用的物理视图文件如何.

@Named
@ViewAccessScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private ClientFacade facade;

    // ...
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 只是JSF标准注释,是的. (2认同)