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.
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