2016-09-19 2 views
2

Предположим, у меня есть класс A, B, C, где класс B содержит сеттеры и геттеры. Я хочу использовать класс B в классе A (выполнить операцию Setter в классе B, установив true) и в классе C (выполнить операцию получения по классу B). Но проблема iam сталкивается, если выполнение get в том же объекте класса B true должно быть напечатано в классе C, а вместо false будет печататься. Сниппет как нижеОшибка при использовании аннотации @Inject в классах

Class A { 
    @Inject 
    B b; 
    //Setting true 
    b.set(true); 
} 

Class B { 
    boolean b; 
    //Setter 
    //Getter 
} 

Class C { 
    @Inject 
    B b; 
    // 
    boolean ball=b.get(); 
    Log.info(ball) //False is getting printed instead of true why is this!! 
} 
+1

Как вы создаете введенный 'b'? По некоторому коду или файлу конфигурации? Как вы устанавливаете 'b' в true? Пожалуйста, прочитайте [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

+0

Это компонент CDI, мы не используем конфигурационный файл, его ничего, кроме инъекции зависимостей. Устанавливаем b в true с использованием метода setter –

ответ

2

Проблема в том, что вы не давая ваши бобы в объем - поэтому по умолчанию все они будут @Dependent. В некоторых случаях это нормально, но вставка фасоли @Dependent в другой такой фасоль создаст новый экземпляр .

Другими словами, class B вы вводите в Class A, не соответствует тому, который вы вводите в class C.

Теперь, как это решить?

Например, вы можете сделать class B фасолью @ApplicationScoped. Объем приложения длится от загрузки контейнера CDi (= от начала) до конца. Таким образом, во всем приложении будет один экземпляр, поэтому состояние компонента будет разделяться между всеми местами, в которые вы его вводите.

@ApplicationScoped 
Class B { 
    boolean b; 
    //Setter 
    //Getter 
} 

Просто примечание стороны: Другой ответ здесь предлагается использовать @Singleton. Я бы посоветовал это сделать, особенно если вы находитесь в среде EE.

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