2010-09-19 11 views
5

Używam wersji Jersey 1.4 ea wraz z wersją Spring 3.0 i integracją jersey-spring. Integracja Jersey i Spring działa dobrze dla klas zasobów, jak opisano w here. Jakkolwiek chcę wstrzyknąć komponent sprężynowy do ContainerRequestFilter, aby wykonać wstępne przetwarzanie żądań.Jersey: Wstaw składnik sprężyny do ContainerRequestFilter

@Component 
public class SecurityFilter implements ContainerRequestFilter { 

    // UserManager is a declared spring component 
    // Injecting it should work somehow 
    @Autowired 
    private UserManager userManager; 

    @Override 
    public ContainerRequest filter(ContainerRequest request) { 
     System.out.println(userManager); 
     // prints out null on request 
    } 
} 

Zarówno filtr, jak i komponent bean menedżera użytkownika są rejestrowane po wdrożeniu aplikacji w programie Glassfish. Zastanawiam się, co robię źle. Czy istnieje sposób na wstrzyknięcie fasoli zarządzanej przez sprężynę do ContainerRequestFilter?

UPDATE

Rodzaj rozwiązania. Problem polega na tym, że Jersey nie otrzymuje Spring bean, jeśli te komponenty są proxy Javy (w przeciwieństwie do generowanych klas proxy). Problem można rozwiązać, instruując Spring, aby ZAWSZE używał klas proxy zamiast Proxies Java, podając atrybut proxy-target-class="true" w odpowiednich częściach konfiguracji sprężyny. W moim scenariuszu musiałem określić go na <tx:annotation-driven proxy-target-class="true" />.

Aby uzyskać bardziej szczegółową analizę i możliwe rozwiązanie, należy zapoznać się z here.

+0

W swoim rozwiązaniu, w jaki sposób SecurityFilter został zarejestrowany w pliku web.xml lub gdzieś indziej? Mam problem tutaj https://stackoverflow.com/q/45509183/4636715, w którym ContainerRequestFilter nie jest w ogóle odwiedzane. – vahdet

Odpowiedz

2

Widzę to samo z wersją Jersey 1.6 i wiosną 3.0.5. Korzystanie z debugera, mogę powiedzieć, że chociaż mój kod jest oznaczony @Component zarówno Wiosna i Jersey będzie instancję własną kopię tej klasy:

@Path("/beams") 
@Produces("text/xml") 
@Component 
@Scope("singleton") 
public class BeamsResource { 
} 

jest jakaś paplanina że zostanie dodana w przyszłości wersja Jersey, ale teraz nie wydaje się działać. Wiem, że to jest ohydne rozwiązanie, ale używam statycznej zmiennej członkowskiej, aby na razie połączyć Jersey i Spring. Bleh.

+1

W końcu znalazłem rozwiązanie dla tego. Po debugowaniu kodu okazało się, że jest to problem w sposobie, w jaki Jersey uzyskuje fasolę Spring z kontekstu. Moje myśli są udokumentowane http://jersey.576304.n2.nabble.com/AW-Jersey-ContainerRequestFilter-as-Spring-component-td5724265.html – nre

+0

Zobacz także aktualizację na moje pytanie. – nre