В следующем коде я пытаюсь внедрить бин SessionScoped в EJB без состояния, но я хочу сделать @Inject в абстрактном базовом классе EJB.В соответствии со спецификацией CDI кажется, что это должно сработать (но не специфика, чтобы тратить слова):
"4.2. Наследование метаданных уровня члена
Предположим, класс Xпрямо или косвенно расширяется классом компонента управляемого компонента или сессионного компонента Y.
Если X объявляет введенное поле x, тогда Y наследует x. "
Я могу получить доступ к унаследованному защищенному члену sessionView из TestEjb, но не из кода в базовом классе.Когда я говорю «могу получить доступ», я имею в виду, что введенный элемент доступен во время выполнения и не является нулевым.
@Named
@ViewAccessScoped
public class JsfBean extends implements Serializable {
@Inject private TestEjb ejb;
SessionView s1 = ejb.getSessionViewChild(); // sessionView injected ok
SessionView s2 = ejb.getSessionViewBase(); // sessionView is null
}
@Named
@SessionScoped
public class SessionView implements Serializable {}
@Stateless
public class TestEjb extends BaseClass implements Serializable {
public SessionView getSessionViewChild() {
return sessionView;
}
}
public abstract class BaseClass implements Serializable {
@Inject
protected SessionView sessionView;
public SessionView getSessionViewBase() {
return sessionView;
}
}
В результате получается, что s1 является допустимой ссылкой на SessionView, но s2 является нулевым.
Я использую MyFaces CODI 1.01 в сочетании с Weld из Glassfish 3.1.1.Я пытался удалить abstract из BaseClass и даже добавил @Named, но это не помогло, и я не вижу, что я делаю неправильно.
В нынешнем виде мне кажется, что мне придетсянаследовать sessionView от базового класса и передавать его обратно в качестве параметра методам из базового класса.Так что я буду признателен, если кто-нибудь может указать, если я делаю что-то глупое, возможно, это проблема CODI / Weld?
Спасибо.