2016-03-23 7 views
2

у меня есть два управляемых бобы, которые оба имеют @ApplicationScope аннотацию:JSF создает два экземпляра бина ApplicationScoped

Storage.java:

@ManagedBean(eager = true) 
@ApplicationScoped 
public class Storage { 

    private static final Logger LOGGER = LoggerFactory.getLogger(Storage.class); 

    private List<Sheet> sheets = new ArrayList<Sheet>(); 

    public List<Sheet> getSheets() { 
     return sheets; 
    } 

    public Sheet load(String id) { 
     // ... 
    } 

    public void storeSheet(Sheet sheet) { 
     sheets.add(sheet); 
     LOGGER.trace(""+this.hashCode()+" Stored sheet: "+sheet); 
    } 

    public void delete(Sheet s) { 
     sheets.remove(s); 
     LOGGER.trace(""+this.hashCode()+" Removed sheet: "+s); 
    } 

} 

StorageInitializer.java:

@ManagedBean(eager = true) 
@ApplicationScoped 
public class StorageInitializer { 

    @ManagedProperty(value = "#{storage}") 
    private Storage storage; 

    @PostConstruct 
    public void init() { 
     int nofSheets = 10; 
     int min = 20; 
     int max = 200; 
     for (int i=0; i<nofSheets; i++) { 
      storage.storeSheet(new Sheet(
        "Sheet "+i, 
        ThreadLocalRandom.current().nextInt(min, max), 
        ThreadLocalRandom.current().nextInt(min, max))); 
     } 
    } 

    public void setStorage(Storage storage) { 
     this.storage = storage; 
    } 

} 

Когда приложение запускается, StorageInitializer должно записать 10 экземпляров в хранилище. Другие бобы с @RequestScoped делают доступ к магазину и делают листы видимыми. Все они имеют

@ManagedProperty(value = "#{storage}") 
    private Storage storage; 

для доступа к бобам Storage.

Записывая хэш, я вижу, что иногда получаю два экземпляра bean-компонента Storage. Первый инициализируется StorageInitializer. Второй используется бобами @RequestScoped и пуст.

Для меня это похоже на состояние гонки или проблему с тиминигами. Если я установил точку останова в StorageInitializer.ini(), все будет хорошо.

Любые идеи?

+0

В какой пакет вы импортировали аннотацию '@ ApplicationScoped'? – BalusC

+0

javax.faces.bean.ApplicationScoped – BetaRide

+0

В обоих случаях? Если все эти классы находятся в WAR (и, следовательно, не EAR), то ваш путь к среде выполнения, скорее всего, загрязнен несколькими различными версиями JSF-библиотек. Проверьте и очистите его. – BalusC

ответ

0

У меня была такая же проблема с двумя объектами @ApplicationScoped beans с "eager = true". Дублированный компонент был в @ManagedProperty в другом компоненте @ApplicationScoped. Я решил проблему, изменив значение fager на bean, принадлежащее @ManagedProperty. В моем случае нетерпеливое значение не было строго необходимым.

+0

Какую версию JSF вы используете? Пробовал последние? – Kukeltje

 Смежные вопросы

  • Нет связанных вопросов^_^