Данные из bean-компонента @RequestScoped используются в разных браузерах.

У меня есть bean-компонент @RequestScoped со свойством List.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.springframework.stereotype.Controller;

@Controller
@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    private List list;

    // getters and setters
}

Это свойство связано с таблицей данных:

<ice:dataTable value="#{myBean.list}" ..other stuff.. />

Список динамически заполняется без проблем, и данные отображаются без проблем. Но если я перейду на другую страницу, а затем вернусь на исходную страницу, данные все еще будут содержать данные исходного запроса. Он не должен снова быть пустым? Если bean-компонент находится в области запроса, он должен быть уничтожен после запроса, и я должен получить и очистить данные в качестве начала.

Еще более странно то, что если я открываю страницу в одном браузере (типа Firefox), заполняю datatable запросом, потом открываю другой браузер (типа Chrome) и захожу на datatable, она заполняется данными из предыдущего запроса из другого браузера! Я думаю, что bean ведет себя как приложение.

Любые идеи?


Обновление 1: класс не является статическим и его переменные. Кроме того, я отключил кеш tomcat, но все равно не работает.

Обновление 2: я думаю, проблема найдена. Мои вспомогательные компоненты помечены @Controller из Spring. Я использую эту аннотацию, потому что затем использую @Autowired для привязки сервисов. Может быть, это создает синглтон, и поэтому он не создается и не уничтожается при каждом запросе? Я уверен, что проблема в сочетании аннотаций Spring и JSF2.


person Fisu    schedule 07.05.2012    source источник


Ответы (1)


Вы не должны управлять одним компонентом с помощью нескольких различных сред управления компонентами, таких как JSF, CDI и Spring. Выберите тот или иной. При управлении компонентом, например, с помощью Spring @Controller все связанные с управлением компонентами аннотации других фреймворков, таких как JSF @ManagedBean и CDI @Named, игнорируются.

Я не использую Spring и понятия не имею, почему вы используете его вместо стандартного API Java EE 6, но симптомы и документация показывают, что область действия такого компонента Spring действительно по умолчанию соответствует области приложения. Вам нужно указать область действия bean-компонента с помощью аннотации Spring @Scope. Вы также хотели бы удалить аннотации управления компонентами JSF, поскольку они в любом случае больше не имеют значения и только запутают разработчика/сопровождающего.

@Controller
@Scope("request")
public class MyBean implements Serializable {
    // ...
}

Кроме того, вы также можете избавиться от аннотации Spring @Controller и придерживаться JSF @ManagedBean. Вы можете использовать @ManagedProperty вместо @Autowired для внедрения другого экземпляра @ManagedBean или даже управляемого компонента Spring (если у вас настроен преобразователь Spring Faces EL) или стандарт Java EE @EJB для внедрения экземпляра @Stateless или @Stateful.

E.g.

@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    @EJB
    private SomeService service;

    // ...
}

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

person BalusC    schedule 07.05.2012
comment
Совершенно верно. Я избавляюсь от @Controller и использую @ManagedProperty и SpringBeanFacesELResolver, и все работает отлично. Спасибо! - person Fisu; 08.05.2012