2013-06-24 2 views
1

Я использую JSF Mojarra 2.1.13, PrimeFaces 3.5 и Spring 3.2.3 для своего приложения. Для DI я использую подход Spring (не CDI). Я следую руководству по демонстрациям PrimeFaces с коллекционером: http://www.primefaces.org/showcase/ui/collector.jsfСвойства бина доступны для разных сеансов

Все работает нормально, я могу добавить свои значения в список, получить их и т. Д. Проблема в том, что, например, если я открою два браузера и добавлю некоторые значения в список, то в другом браузере я добавлю несколько значений, а если обновить браузер, я увижу все значения, которые были введены в обоих браузерах. Поэтому, если я ввожу два значения в один браузер два в другом, после обновления их я вижу четыре значения в обоих браузерах. Я хочу, чтобы мои ценности не делились между разными сеансами.

Мой боб выглядит следующим образом:

@Component 
@ManagedBean 
public class ClientBean extends BaseBean { 

    private Client client = new Client(); 

    private List<Client> clients = new LinkedList<>(); 

    public String reInit() { 
     client = new Client(); 
     return null; 
    } 

    public Client getClient() { 
     return client; 
    } 

    public void setClient(Client client) { 
     this.client = client; 
    } 

    public List<Client> getClients() { 
     return clients; 
    } 

    public void setClients(List<Client> clients) { 
     this.clients = clients; 
    } 
} 

Я знаю, что я создаю глобальные переменные:

private Client client = new Client();  
private List<Client> clients = new LinkedList<>(); 

Но это показано в руководстве. Итак, как я могу справиться с этой ситуацией, чтобы сделать коллекционную работу так, чтобы эти переменные не были доступны для разных сеансов?

EDIT Я попытался аннотирования мой боб с: @RequestScoped или @SessionScoped - не работает. Та же проблема остается.

ответ

5

Не совсем уверен, почему вы сконфигурировали @ManagedBean как @Component для начала. Эта проблема связана с тем, что Spring обрабатывает один экземпляр @Component через ваше приложение (или, по крайней мере, так оно выглядит с вашего объяснения). Удалите его и используйте @ViewScoped в управляемом компоненте, чтобы эта работа работала должным образом. Обратите внимание, что если вы используете Spring для управления управляемых компонентов JSF, то вы должны добавить эту конфигурацию в ваших лицах-config.xml (от mkyong tutorial):

<application> 
    <el-resolver> 
     org.springframework.web.jsf.el.SpringBeanFacesELResolver 
    </el-resolver> 
</application> 

Но делая это, вы будете потери сила @ViewScoped управляемых бобы. Чтобы решить эту ошибку, вы должны реализовать @ViewScoped весной. Есть много примеров в интернете об этом, и выглядят, что наиболее популярным является из Cagatay's

Более подробная информации о JSF управляемых бин областях: Communication in JSF 2: Managed bean scopes

+0

Это большие ответов. Я только начинаю работать с JSF с Spring. Я не знал, что у меня может быть область просмотра с Spring. Причина, по которой я использую ManagedBean с компонентом, заключается в том, что компонент служит для назначения Spring DI и из ManagedBean. Я могу отображать значения в представлении. Я бы не смог использовать его в тегах JSF, если бы он не был аннотирован с помощью ManagedBean. Но да, теперь ясно. Огромное спасибо! – user2219247

+0

@ user2219247 добро пожаловать. –