Jersey2 Client jeter javax.ws.rs.NotFoundException
J'ai écrit un échantillon de REPOS de service à l'aide de Jersey2.
Voici mon web.xml:
<web-app>
<display-name>jerseysample</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.adaequare.rest.config.JerseyResourceInitializer</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Voici mon exemple de classe:
package com.adaequare.resource;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class Hello {
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello(){
return "<html><title>Hello Jersey</title><body><h1>Hello Jersey</h1></body></html>";
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
//This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
}
}
J'ai déployé pour Tomcat et je suis en mesure d'accéder à l'URL suivante:
http://localhost:8080/jerseysample/rest/hello
J'ai essayé d'écrire un test unitaire de cette façon:
package com.adaequare.client;
public class MyResourceTest {
public static final URI BASE_URI = UriBuilder.fromUri("http://localhost").port(8080).build();
private HttpServer server;
private WebTarget target;
@Before
public void setUp() throws Exception {
ResourceConfig rc = new ResourceConfig(Hello.class);
server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, rc);
server.start();
Client c = ClientBuilder.newClient();
target = c.target(BASE_URI);
}
@After
public void tearDown() throws Exception {
server.shutdownNow();
}
@Test
public void testGetIt() {
String responseMsg = target.path("jerseysample").path("rest").path("hello").request().get(String.class);
System.out.println("I am here");
assertEquals("Got it!", responseMsg);
}
}
Cette classe lève l'exception.
Sur l'exécution de cette classe, je suis l'exception suivante:
Exception in thread "main" javax.ws.rs.NotFoundException: HTTP 404 Not Found
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:917)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:770)
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:90)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:671)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:423)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296)
at com.adaequare.client.TestClient.main(TestClient.java:14)
Je suis sûr que je suis absent de la configuration des trucs. J'ai visionné à voir la cause du problème, mais en vain. Quelqu'un peut s'il vous plaît laissez-moi savoir si je suis absent quelque chose?
OriginalL'auteur Prasanth | 2014-03-08
Vous devez vous connecter pour publier un commentaire.
Votre service est mappée (et vous dites que vous pouvez y accéder):
http://localhost:8080/jerseysample/rest/hello
mais à l'aide de votre client que vous appelezhttp://localhost:8080/restserver/rest/hello
qui est différent de l'URL. Quelle est la surprise?Essayer
Comme pour le deuxième test, essayez d'appeler getUri() sur votre WebTarget de voir que l'URL qui vous sont effectivement à l'appel, il devrait vous aider à voir où est le problème.
Après votre mise à jour:
Eh bien la première chose est, vous n'avez pas spécifié (en termes de négociation de contenu) ce que votre client accepte (vous l'avez fait dans votre exemple précédent, vous avez supprimé). Mais cela ne devrait pas être un problème puisque dans ce cas, le serveur doit vous envoyer un de ceux mis en œuvre depuis en ne spécifiant il vous indiquant que vous soutenez toutes sortes de réponses. Mais le problème est probablement de mettre
String.class
enget()
méthode. Il devrait y aller une entité que vous voulez Maillot de transformer la réponse. Si vous souhaitez obtenir de Chaîne, je voudrais faire quelque chose comme ceci:Mais vous ne pouvez pas dire à coup sûr un de vos trois méthode va être appelé, car il est sur le même CHEMIN, de sorte que vous devez aussi spécifier le contenu en la passant à
request
méthode.Modifié la question en conséquence
Et j'ai répondu.
J'ai essayé de la cible.path("jerseysample").path("repos").path("bonjour").demande().get() et c'est toujours le même. Aussi, j'ai essayé de la cible.path("jerseysample").path("repos").path("bonjour").demande(MediaType.TEXT_HTML).get(). Dans les deux cas, voici ce que j'ai eu quand j'ai imprimé la réponse: "InboundJaxrsResponse{ClientResponse{method=GET, uri=localhost:8080/jerseysample/repos/hello, status=404, raison=Pas Trouvé}}'
Mais un changement est déjà quand je faisais demande().get(String.class), junit est un échec. Maintenant, après l'avoir supprimé, junit n'est pas un échec. Mais toujours à partir de l'élément de réponse, je peux voir que c'est une erreur 404
OriginalL'auteur TondaCZE
Espère que cela aide ceux qui peuvent être confrontés au même problème. Dans mon cas, j'ai créé mon service web RESTful projet avec Netbeans Assistant. Pour une raison quelconque, je ne sais pas pourquoi, il a raté le ApplicationConfig.java la classe qui contient l'annotation @javax.ws.rs.ApplicationPath("webresources"). Je ne sais pas pourquoi quand j'ai généré le client, il m'a montré le chemin d'accès correct que j'attendais.
Donc, la solution pour moi a été de copier une autre ApplicationConfig.java à partir d'un autre projet, et d'ajouter ma façade pour les ressources.
OriginalL'auteur jmoran
si vous n'avez pas de config web.xml à la recherche du reste des classes, vous devez utiliser
@ApplicationPath
pour indiquer les classes de garder le Reste des ressources.OriginalL'auteur Alisson Gomes
Il y a une erreur dans web.xml
s'il vous plaît essayer ci-dessous
OriginalL'auteur kiran