2017-08-19 2 views
0

Je suis en Jersey 2,26-B09 sur le dessus de Grizzly, et je suis en utilisant le code suivant pour démarrer le serveur HTTP Grizzly:Jersey + Grizzly - @ApplicationPath ignoré

public void start() { 
    URI uri = UriBuilder.fromPath("").scheme("http").host("localhost").port(8084).path("/rest").build(); 
    Map<String, String> params = new HashMap<>(16); 
    String applicationClassName = RestApplication.class.getName(); 
    String applicationPackageName = RestApplication.class.getPackage().getName(); 
    String productionPackageName = ProductionService.class.getPackage().getName(); 
    params.put(ServletProperties.JAXRS_APPLICATION_CLASS, applicationClassName); 
    params.put(ServerProperties.PROVIDER_PACKAGES, productionPackageName + "," + applicationPackageName); 
    HttpServer server = GrizzlyWebContainerFactory.create(uri, params); 
    server.start(); 
} 

La classe étend RestApplication application et a une annotation @ApplicationPath ("/ system"). La classe ProductionService est une ressource REST avec un @Path ("/ production") annotation.

Je peux voir que le chemin spécifié dans @ApplicationPath est ignoré: mes ressources sont accessibles dans/rest/production et non dans/rest/system/production.

J'ai essayé de changer l'URI/repos/système au lieu de/repos, mais en vain:

URI uri = UriBuilder.fromPath("").scheme("http").host("localhost").port(8084).path("/rest/system").build(); 

L'application est déployée dans le contexte racine/repos, pas/repos/système .

Qu'est-ce qui me manque?

Bien sûr, comme une solution de contournement que je pouvais changer le chemin des ressources de «/production » à «/système/production », mais je voudrais savoir pourquoi le chemin d'application est ignorée.

+1

L'annotation s'extrait dans un ServletContainerInitializer (principalement dans les déploiements de guerre). Je ne sais pas si Grizzly soutient cela. Peut-être que vous devez essayer de configurer l'application comme une guerre, et déployer la guerre. Je n'ai jamais essayé d'utiliser une guerre avec grizzly, donc je ne suis pas sûr de savoir comment le configurer. Mais je sais que l'initialiseur n'est pas appelé avec une configuration programmatique comme celle-ci. –

+0

Merci @peeskillet. Je l'ai trouvé un exemple sur la façon de configurer avec une programmation grizzly application web: https://stackoverflow.com/questions/22593983/using-jersey-with-grizzly?rq=1. Je vais lui donner une chance. –

+0

Ce n'est pas ça. C'est déjà ce que fait le 'GrizzlyWebContainerFactory' sous le capot. Ce que je veux dire, c'est de compresser votre projet en tant que WAR, puis configurer grizzly pour déployer cette guerre. ApplicationPath a été réellement conçu pour les déploiements WAR pour la découverte automatique et non pour les déploiements intégrés. Il n'y a pas vraiment besoin de ça. puisque vous pouvez configurer l'URL par programme. –

Répondre

0

J'ai changé le code qui crée et initialise le serveur:

public void start() { 
    URI uri = UriBuilder.fromPath("").scheme("http").host("localhost").port(8084).build(); 
    Map<String, String> params = new HashMap<>(16); 
    String applicationPackageName = RestApplication.class.getPackage().getName(); 
    String productionPackageName = ProductionService.class.getPackage().getName(); 
    params.put(ServerProperties.PROVIDER_PACKAGES, productionPackageName + "," + applicationPackageName); 

    HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri); 
    WebappContext context = new WebappContext("system", "/rest/system"); 
    ServletRegistration registration = context.addServlet("jersey", ServletContainer.class); 
    registration.setInitParameters(params); 
    registration.addMapping("/*"); 
    context.deploy(server); 

    server.start(); 
} 

Un contexte d'application Web est créé et sert les ressources à la trajectoire souhaitée. Étant donné que l'initialiseur de conteneur de servlet n'est pas appelé dans cette approche par programme, la propriété ServletProperties.JAXRS_APPLICATION_CLASS n'est pas définie.

Je pensais que la définition de cette propriété ont fait le travail, mais il ne fonctionne pas. Merci à @peeskillet pour l'indice.