2017-10-06 2 views
0

J'essaye de mettre à jour WAR avec le vieux RESTEasy 3.0.5 vers quelque chose de plus récent. 3.0.6 fonctionne correctement, mais après la mise à jour vers la version 3.0.7 (ou supérieure, comme 3.0.24), toutes les ressources (@Path) sont perdues - 404 pour n'importe quelle ressource. WAR est exécuté sous le serveur Apache Tomcat.RESTEasy annotation scan impossible de trouver des ressources (sous Tomcat)

Je crois que la raison est liée au changement du scanner d'annotation: https://issues.jboss.org/browse/RESTEASY-1010

J'ai essayé de créer la classe qui étend javax.ws.rs.core.Application au lieu de configuration web.xml. Selon la réponse https://stackoverflow.com/a/29957040/2528366, l'ensemble vide doit déclencher l'analyse pour @Path mais aucune ressource n'est trouvée. Si je remplace getClasses() qui renvoie un ensemble non vide, ces ressources fonctionnent comme prévu.

web.xml: https://pastebin.com/uRD2w6Z6

Nouvelle Application classe héritée:

@ApplicationPath("/rest") 
public class WebApi extends Application 
{ 
    @Override 
    public Set<Class<?>> getClasses() 
    { 
     Set<Class<?>> s = new HashSet<>(); 
     // if line below is uncommented SomeResource works fine 
     // s.add(SomeResourceImpl.class); 
     return s; 
    } 
} 

ressources sont des interfaces et la mise en œuvre est dans les classes dérivées. Le déplacement des annotations vers les classes ne change rien.

Qu'est-ce qui ne va pas avec les annotations ou la configuration? Ou y a-t-il autre chose nécessaire pour déclencher la numérisation des annotations?

+0

Que faire si vous supprimez la barre oblique avant 'rest' dans' ApplicationPath'? – Dimitri

+0

@Dimitri Je ne vois pas de différence, fonctionne de la même manière, si l'ensemble est vide, rien ne fonctionne, sinon - les ressources ajoutées fonctionnent. –

Répondre

0

Si vous utilisez un Tomcat version qui est compatible avec la spécification Servlet 3.0, vous devez ajouter la dépendance resteasy-servlet-initializer:

<dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-servlet-initializer</artifactId> 
     <version>${resteasy.version}</version> 
    </dependency> 

Comme il est indiqué dans la documentation:

Resteasy utilise le ServletContainerInitializer Interface d'intégration dans des conteneurs Servlet 3.0 pour initialiser une application, en recherchant automatiquement les ressources et les fournisseurs. Pour activer l'analyse automatique, vous devez également inclure l'artefact resteasy-servlet-initializer dans votre fichier WAR

+0

Oui, j'ai déjà cette dépendance. –

+0

Avez-vous un fichier 'beans.xml'? Pouvez-vous donner plus d'informations sur la configuration de votre application? – Dimitri

+0

Non, je ne le fais pas. Ok, je vais faire une application minimale sans code privé et des dépendances inutiles. –