Вопрос по managed-bean, jsf, jsf-2, java, java-ee – Готовые ApplicationScoped управляемые bean-компоненты, созданные несколько раз

5

У меня есть кучанетерпеливый ApplicationScoped управляемые бобы. Некоторые из них вводятся в другиеManagedProperty аннотация, формирующая дерево зависимостей. Каждый зависимый компонент манипулирует своим родителем после построения.

Однако создается впечатление, что для каждой инъекции создается новый экземпляр, что отменяет предыдущие манипуляции. Насколько я понимаю,ApplicationScoped боб должен быть создан только один раз. Я неправильно понял или почему это происходит? Это потому, что они хотят?

Вот пример:

ParentBean.java
package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean(eager = true)
@ApplicationScoped
public class ParentBean
{
    static int initCount = 0;

    // ...

    @PostConstruct
    public void init()
    {
        ++initCount; // Will end up being between 1 and 3. Expected always 1.

        // ...
    }
}
Child1Bean.java
package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean(eager = true)
@ApplicationScoped
public class Child1Bean
{
    @ManagedProperty("#{parentBean}") ParentBean parentBean;

    public ParentBean getParentBean()
    {
        return parentBean;
    }

    public void setParentBean(ParentBean parentBean)
    {
        this.parentBean = parentBean;
    }

    @PostConstruct
    public void init()
    {
        // manipulate parentBean
    }
}
Child2Bean.java
package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean(eager = true)
@ApplicationScoped
public class Child2Bean
{
    @ManagedProperty("#{parentBean}") ParentBean parentBean;

    public ParentBean getParentBean()
    {
        return parentBean;
    }

    public void setParentBean(ParentBean parentBean)
    {
        this.parentBean = parentBean;
    }

    @PostConstruct
    public void init()
    {
        // manipulate parentBean
    }
}
Можете ли вы привести пример кода, как вы это делаете? Aksel Willgert
Я неУ меня нет никаких инъекций и возникает та же проблема с Tomcat7.0.53 / Mojarra 2.2.6. Моя область применения готового компонента построена 3 раза. Не стремящиеся построены только один раз. Panu Haaramo
дон»Не думаю, что я сделаю какие-либо изменения, но попробуйте,@ManagedProperty(value = "#{parentBean}") Daniel
Выражения эквивалентны, но я попробовал. Без изменений. Spomf
Хорошо, я добавил пример. Spomf

Ваш Ответ

2   ответа
0

что проблема связана с многопоточной инициализацией JSF. Попробуйте отключить его с помощью параметра com.sun.faces.enableMultiThreadedStartup.

Вы решили? у меня та же проблема MiguelAngel_LV
Спасибо, но это не имело никакого эффекта. Мое приложение работает на Mojarra 2.1.6. Spomf
1

я решил эту проблему на Tomcat 8 + Mojarra 2.2.0. В моем случае я просто удалил объявление слушателя из web.xml

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

Кажется, конструктор вызывается один раз потом.

О входе слушателя есть часть ответа BalusC оэтот вопрос.

В любом случае, явная регистрация Мохарраs ConfigureListener в web.xml на самом деле необходим только для обхода старых неисправных серверов, таких как GlassFish v3 и Jetty, которые не смогли найти слушателя в Mojarra.файл TLD. При развертывании на достойном сервере вся запись не нужна.

Похожие вопросы