@Inject в базовом классе является нулевым в методах базового класса, хорошо в производном классе - PullRequest
1 голос
/ 10 декабря 2011

В следующем коде я пытаюсь внедрить бин 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?

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Это ошибка в Weld. Если он работает с другими областями действия, это ошибка пользовательских областей в сочетании со сваркой.

0 голосов
/ 15 декабря 2011

Оказывается, мое понимание проблемы на момент публикации было основано на слишком ограниченный набор наблюдений - все было неправильно. Оказывается, что настоящая проблема заключалась в том, что я не смог успешно внедрить менеджер сущностей в ejb без состояния с помощью @PersistenceContext в перегруженном методе, который принимает параметр универсального типа. Эта проблема предположительно решена в Glassfish 3.1.2. Например:

@Stateless
public class Myejb<T> {

  @PersistenceContext(unitName = "TestPU")
  private EntityManager em;

  public void find(String id) { em.find... }
  public void find(T id) { em.find... }

em в find (T id) будет нулевым, и при использовании @EJB возникает та же проблема, что и при @PersistenceContext. Действительно большой!

http://java.net/jira/browse/GLASSFISH-17235

...