EJB 3.1 @ EJB Wtrysk do POJO

Być kompletnym turbot dziś po południu i nie wydaje się znaleźć odpowiedź gdziekolwiek.

Z nową specyfikacją EJB 3.1 Czy możliwe jest wstrzyknięcie EJB do pojo? Wiem, że w EJB 3.0 adnotacja @ EJB może być używana do wstrzykiwania EJB, ale to nie działało na prostych pojosach.

Jeśli nie jest to czy muszę szukać fasoli w JNDI jak Wiem nie można po prostu użyć nowego słowa kluczowego.

Z góry dzięki.

Karl

Author: Pascal Thivent, 2010-01-07

4 answers

Tak, użyj JNDI lookup.

Ponieważ twoje POJO jest tworzone przez Ciebie (zakładam), kontener nie jest odpowiedzialny za wstrzykiwanie zależności.

 19
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 17:37:41

Z nową specyfikacją EJB 3.1 Czy możliwe jest wstrzyknięcie EJB do pojo? Wiem, że w EJB 3.0 adnotacja @ EJB może być używana do wstrzykiwania EJB, ale to nie działało na prostych pojosach.

Wstrzyknięcie EJB do POJO jest możliwe Jeśli używasz JSR-299 (Java Contexts and Dependency I njection) tzn. jeśli Twoje POJO jest zarządzanym CDI. W takim razie możesz zrobić:

@Inject MyEJB service

Ale to nie jest funkcja EJB 3.1, to pochodzi z CDI. A jeśli nie używasz CDI, musisz to sprawdzić.

 28
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-22 03:16:56

Nowa Specyfikacja EJB (3.1) dodaje możliwość określania globalnych nazw JNDI dla EJB. Oznacza to, że można ich używać w każdej fasoli, w dowolnym miejscu.

Musisz jednak przeprowadzić jawne wyszukiwanie JNDI, ponieważ kontener EJB 3.1 nie będzie wiedział o Twoim POJO.

Jedynym wyjątkiem, który zgaduję, że nie dotyczy ciebie, jest to, że jeśli Twoje POJO jest naprawdę klientem aplikacji, w którym to przypadku pod warunkiem, że pole, które ma zawierać EJB jest statyczne, możesz zastosować do niego adnotację @ EJB. Jeśli taka jest Twoja sytuacja, powinieneś zapoznać się z zasadami klienta aplikacji w ogólnej specyfikacji Java EE 5.

Wreszcie, Java EE 6, wraz z włączeniem JSR-299, może w jakiś sposób pozwolić na to, co opisujesz; nie znam jeszcze specyfikacji, więc nie mogę jej skomentować.

Mam nadzieję, że to wszystko pomoże.

 7
Author: Laird Nelson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-07 18:19:36

Zastanawiam się też, czy mógłbym wstrzyknąć EJB do niezarządzanych obiektów . Więcej szczegółów można znaleźć w dokumentacji Weld (JSR 299 reference implementation).

Ale możesz wykonać iniekcję zależności ręcznie wewnątrz repozytorium lub fabryki w następujący sposób:

@Stateless
public PojoRespository {

  @Inject
  ResourceForPojos resource;
  @PersistenceContext
  private EntityManager em;

  public Pojo findById(Object id) {
    Pojo p = (Pojo) em.find(Pojo.class, id);
    p.setResource(resource); // injects resource
    return p;
  }

}

Jeśli masz wiele metod, w których należy wykonać wstrzyknięcie, możesz użyć Interceptora.

 1
Author: deamon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:30:42