2017-08-15 3 views
0

Wenn ich eine sehr grundlegende haben Application, entdeckt Jersey Auto alle REST-Ressourcen im Projekt und ich muss sie nicht manuell registrieren:Jersey ResourceConfig wird nicht automatisch erkannt, aber die Anwendung funktioniert?

import javax.ws.rs.ApplicationPath; 
@ApplicationPath("/rest") 
public class Application extends javax.ws.rs.core.Application { 

} 

Aber wenn ich schalte das Jersey spezifischen ResourceConfig zur Verwendung von Auto Entdeckung scheint nicht zu funktionieren. Ich muß entweder #registerClasses() oder das Paket hinzufügen, wie unten dargestellt:

@ApplicationPath("rest") 
public class ResourceConfig extends org.glassfish.jersey.server.ResourceConfig { 
    public ResourceConfig() { 
     super();   
     register(RolesAllowedDynamicFeature.class); 
     super.packages(true, "org.example"); 
    } 
} 

Gibt es eine Möglichkeit ResourceConfig zu Auto zu bekommen, die REST-Ressourcen wie Application entdecken, ohne die Klassen einzeln registrieren zu müssen oder mit zu dem Paket der Anwendung hinzufügen?

Antwort

0

Hier ist der Deal: Was verursacht Klassenpfad Scannen, ist eine Application Klasse, die nicht registriert nichts. In Ihrer ResourceConfig (die Application erweitert), wenn Sie die RolesAllowedDynamicFeature nicht registriert haben, erhalten Sie den Klassenpfad-Scan. Meine Vermutung ist, dass Sie auf die ResourceConfig gewechselt haben, so dass Sie die RolesAllowedDyanamicFeature registrieren können (vielleicht aus einem Beispiel, das Sie gesehen haben). Dies könnte auch in der Application Klasse durch Überschreiben der getClasses() getan werden. Aber wie ich schon sagte, sobald Sie irgendetwas registrieren, verlieren Sie den Classpath Scan, und Sie müssen alles manuell registrieren.

Eine Umgehungslösung besteht darin, eine Feature zu implementieren, um alle Ihre Klassen zu registrieren, die sonst nicht vom Klassenpfad-Scan erfasst werden.

@Provider 
public class ClassPathScanWorkAroundFeature implements Feature { 
    @Override 
    public boolean configure(FeatureContext context) { 
     context.register(RolesAllowedDynamicFeauture.class); 
     return true; 
    } 
} 

Dies wird für die Arbeit sowohl der Application oder die ResourceConfig Klasse. Was während des Klassenpfad-Scans passiert, ist, dass Jersey sowohl nach @Pathals auch@Provider annotierten Klassen sucht, die registriert werden sollen. Das ist also eine Problemumgehung, um Dinge manuell zu registrieren und dennoch den Klassenpfad-Scan beizubehalten.

Eine Sache, auf die ich hinweisen möchte, ist der folgende Artikel von einem der Entwickler von Jersey.

Grundsätzlich schlagen sie nie, es zu benutzen. Persönlich würde ich nur bei Paket Scan bleiben. Ich glaube nicht, dass es das Leben wirklich viel schwieriger macht. Es ist eigentlich weniger Code, als die Alternative der Verwendung der Feature.

Verwandte Themen