Добавить элементы в список в запросе Scoped Bean

У меня есть бэк-бин следующим образом:

@Named
@RequestScoped
public class ClientNewBackingBean {

    @Inject
    private ClientFacade facade;
    private Client client;

Client класс имеет List<Child> childrenList атрибут, среди других. Я могу создать новый Client при настройке childrenList с new 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);
}

Каждый раз Add Child нажата кнопка, бин воссоздается, и в представлении отображается только один ребенок John Doe (я полагаю, что он является областью действия запроса). Есть ли другой способ решения этой проблемы, кроме изменения области действия компонента на Session?

2 ответа

Решение

Если вы использовали стандартную аннотацию управления компонентами JSF @ManagedBean, вы могли бы решить это, просто поместив компонент в область видимости, @ViewScoped,

@ManagedBean
@ViewScoped
public class ClientNewBackingBean implements Serializable {

    @EJB
    private ClientFacade facade;

    // ...

В CDI @ViewScoped однако не существует, ближайшая альтернатива @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";
    }

}

Вы также можете использовать расширение CDI MyFaces CODI, которое прозрачно соединит JSF @ViewScoped аннотация для правильной работы вместе с @Named:

@Named
@ViewScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private ClientFacade facade;

    // ...

Альтернативой CODI является использование @ViewAccessScoped который действует до тех пор, пока последующие запросы ссылаются на один и тот же управляемый компонент независимо от используемого файла физического представления.

@Named
@ViewAccessScoped
public class ClientNewBackingBean implements Serializable {

    @Inject
    private ClientFacade facade;

    // ...

Смотрите также:

Если вы используете JSF 2, вы должны использовать ViewScoped боб.

Другие вопросы по тегам