Ich benutze Jersey 1.4 ea zusammen mit Spring 3.0 und der jersey-spring
Integration. Die Integration von Jersey und Spring funktioniert gut für Ressourcenklassen wie beschrieben here. Wie auch immer, ich möchte eine Federkomponente in eine ContainerRequestFilter injizieren, um einige Vorverarbeitungen von Anfragen zu machen.Jersey: Injection Spring Komponente in 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
}
}
Sowohl der Filter als auch die User-Manager-Bean werden registriert, wenn ich die Anwendung an Glassfish veröffentliche. Ich frage mich, was ich falsch mache. Gibt es eine Möglichkeit, eine federverwaltete Bean in einen ContainerRequestFilter zu injizieren?
UPDATE
Art gelöst. Das Problem besteht darin, dass Jersey keine Spring-Beans erhält, wenn diese Beans Java-Proxies sind (im Gegensatz zu generierten Proxy-Klassen). Das Problem kann gelöst werden, indem Spring angewiesen wird, IMMER Proxy-Klassen anstelle von Java-Proxys zu verwenden, indem das Attribut proxy-target-class="true"
in den entsprechenden Teilen einer Federkonfiguration angegeben wird. In meinem Szenario musste ich es auf <tx:annotation-driven proxy-target-class="true" />
angeben.
Eine detailliertere Analyse und eine mögliche Fehlerbehebung finden Sie unter here.
In Ihrer Lösung, wie dieser SecurityFilter in der Datei web.xml oder woanders registriert wurde? Ich habe ein Problem hier https://stackoverflow.com/q/45509183/4636715, in dem der ContainerRequestFilter überhaupt nicht besucht wird. – vahdet