2013-07-30 23 views
5

Zajmuję się tworzeniem aplikacji REST za pomocą Glassfish 4.0.Filtr GlassFish 4 + JAX-RS z @EJB

W klasach zasobów mogę wykonać wstrzyknięcie do pracy, wykonując klasę @Stateless i wstrzykując przez @EJB (wstrzyknięta klasa jest statusem EJB bez statu).

Jednak to podejście nie działa w filtrze JAX-RS. Nie mogę w ogóle dostać zastrzyku do pracy.

patrz kod poniżej:

@Provider 
public class UpdateFilter implements ContainerRequestFilter { 

    @EJB 
    private MyBeanInterface doStuffBean; 

    @Override 
    public void filter(ContainerRequestContext requestContext) { 

     ... 
    } 
} 

doStuffBean zawsze ma wartość null.

Wszelkie sugestie?

Odpowiedz

1

Wierzę, że @EJB działa tylko w klasach zarządzanych Java EE, takich jak inne EJB i serwlety.

Jeśli używasz CDI, możesz zamiast tego użyć adnotacji @Inject, ale jeśli ta klasa nie jest ManagedBeanem, musisz wykonać wyszukiwanie.

+0

@Inject nie działa. Zgłaszany jest wyjątek: ** UnsatisfiedDependencyException: Nie było obiektu do wstrzyknięcia ... **. – bafitor

+0

To dlatego, że twoja klasa nie jest zarządzanym komponentem bean. Nie jestem pewien, czy mogę zrobić tego Providera jako ManagedBean, więc prawdopodobnie będziesz musiał stworzyć własnego producenta, który wykonuje wyszukiwanie EJB, a następnie możesz wstrzyknąć gdziekolwiek (jest wiele artykułów pokazujących, jak to zrobić) lub ty można po prostu wykonać wyszukiwanie w tej klasie. – ZeusSelerim

0

Spróbuj użyć CDI, zastępując @Stateless przez @ManagedBean i @EJB przez @Inject. To działa dla mnie w JAX-RS.

Jeśli potrzebujesz EJB do innych rzeczy niż wstrzyknięcie, może ci pomóc zachować podwójną adnotację @Stateless @ManagedBean.

+0

Próbowałem obu rozwiązań, ale to nie działa. Dostałem ** UnsatisfiedDependencyException: Nie było obiektu do wstrzyknięcia. **. Dowolny pomysł? – bafitor

+1

Nie widziałem tego wcześniej z GF3, więc prawdopodobnie problem w GF4. https://java.net/jira/browse/GLASSFISH-20597 mówi, że zostało naprawione w wersji 4.0.1 - czy jest to wersja, której używasz? Jeśli nie, możesz wypróbować niektóre sugestie dotyczące obejścia problemu na stronie http://stackoverflow.com/questions/16216759/dependency-injection-with-jersey-2-0 Czy próbowałeś usunąć @Stateless lub potrzebujesz go? – TheArchitect