2012-05-08 12 views
11

Esta es la primera vez que uso Eclipse, y me está causando rabia.Rest Web services devolviendo un 404

he instalado Tomcat 6.0, descargué las bibliotecas Jersey, y seguido los tutoriales de: http://www.vogella.com/articles/REST/article.html#first_client

creé el nombre del proyecto como RestExample, y dentro de ella tengo un paquete y dentro de.jay.jersey.first que tengo un HelloWorldResource clase, y esto es lo que parece:

package de.jay.jersey.first; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Path("/hello") 
public class HelloWorldResource { 
// This method is called if TEXT_PLAIN is request 
@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>"; 
} 

// This method is called if HTML is request 
@GET 
@Produces(MediaType.TEXT_HTML) 
public String sayHtmlHello() { 
    return "<html> " + "<title>" + "Hello Jersey" + "</title>" 
      + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; 
} 
} 

y mi web.xml parece que

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>RestExample</display-name> 
    <servlet> 
<servlet-name>Jersey REST Service</servlet-name> 
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>de.jay.jersey.first</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> 

y estoy tratando de utilizar rizo como:

rizo http://localhost:8081/RestExample/rest/hello

Apache Tomcat/6.0.35 - Informe de error

estado HTTP 404 -/RestExample/descanso/Hola

tipo Estado re puerto

mensaje/RestExample/descanso/hola

de cripción El recurso solicitado (/ RestExample/descanso/hola) es no disponible.

Apache Tomcat/6.0.35

La pregunta es, ¿qué debo cambiar en el web.xml para poder acceder a ese recurso?

Probé RestExample/de.jay.jersey.first/rest/hello, y aún así no funcionó. TOmcat se está ejecutando sin errores.

+0

¿Cómo implementó esta aplicación en Tomcat? Específicamente, ¿dónde se encuentra su web.xml y dónde se encuentra su archivo de clase? –

+0

Probé Tomcat 7.0 y funciona bien – DaTroop

+0

Cambié solo cosas mínimas como la versión de Servlet de 2.5 a 3.0 en web.xml – DaTroop

Respuesta

1

he probado con Tomcat 7.0 y funciona bien:

package de.jay.jersey.first; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Path("/hello") 
public class HelloWorldResource { 
// This method is called if TEXT_PLAIN is request 
    @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>"; 
    } 

// This method is called if HTML is request 
    @GET 
    @Produces(MediaType.TEXT_HTML) 
    public String sayHtmlHello() { 
     return "<html> " + "<title>" + "Hello Jersey" + "</title>" 
       + "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> "; 
    } 
} 

Web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <display-name>RestExample</display-name> 
    <servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>de.jay.jersey.first</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> 

Examinada a http://localhost:8084/RestExample/rest/hello y funciona bien

+0

Esta configuración es buena si estás en Jersey 1.x. Jersey 2.x tiene diferentes nombres de paquetes y nombres de paquetes. Por lo tanto, la misma configuración no funcionará si está utilizando 2.x jarras. Solo pensé en mencionarlo, por lo que evitará problemas innecesarios para alguien que tenga 2.x jar en su classpath. – adityalad

-2

como el aticle dice:

// Get the Todos 
    System.out.println(service.path("rest").path("todos").accept(
      MediaType.TEXT_XML).get(String.class)); 
    // Get XML for application 
    System.out.println(service.path("rest").path("todos").accept(
      MediaType.APPLICATION_JSON).get(String.class)); 
    // Get JSON for application 
    System.out.println(service.path("rest").path("todos").accept(
      MediaType.APPLICATION_XML).get(String.class)); 

intenta especificar la ruta de método a la que desea llamar

12

Me llevó mucho tiempo descubrir por qué no funcionaba para mí a pesar de buscar en toda la web para encontrar una solución. El error que estaba cometiendo era que los nombres de los paquetes no estaban actualizados en la nueva API. Esto es lo que los nombres de paquetes actualizados debe ser similar (Web.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <display-name>RestExample</display-name> 
    <servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>de.jay.jersey.first</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> 

en cuenta que <servlet-class> y <param-name> son diferentes (actualizado) de vogella tutorial. Puede que no sea la respuesta a esta pregunta en particular, pero podría ayudar a alguien. Lo encontré en here.

+0

Gracias @gndps me salvaste el día. Tu respuesta merece estar en la cima en realidad. Cambié el proyecto y moví la parte web.xml también, pero olvidé cambiar el nombre de mi paquete. Tu respuesta me ayudó. Gracias de nuevo – samir

+0

@samir - lo que significa gndps no es el nombre de su paquete, sino el nombre de init param donde proporciona el nombre de su paquete en web.xml. Aún así, la solución que ha hecho es válida para su problema, pero ligeramente diferente del problema explicado aquí. El nombre de init-param para mencionar los paquetes difiere con diferentes versiones de jersey. –

2

Por favor, añadir todos los tarros dadas en su proyecto

Proyecto (clic derecho)> Propiedades Ruta> Java Build> Bibliotecas> Añadir JAR/Añadir JAR externos

  1. asm-3.1.jar
  2. jersey-bundle-1.14.jar
  3. jersey-client.jar
  4. jersey-core.1.17.1.jar
  5. Jersey-server-1.17.jar
  6. Jersey-servlet-1.17.jar
0

busqué una solución para el mismo problema durante horas también.

Esto resolvió mi problema:

Si utiliza un Maven-Proyecto (por ejemplo, con el arquetipo de maven-arquetipo-webapp) y el HelloWorldResource clase se implementa en la carpeta src/main/resources esta clase doesn 't se compilan (por ejemplo, a continuación, ejecutar "mvn paquete limpio" o "ejecutar en el servidor" en Eclipse)

Implementar HelloWorldResource en la carpeta src/main/java vez y no más de 404 occures .. (si crea Maven-Project con maven-archetype-webapp, la carpeta necesita ser creada manualmente)

1

Comprobar si la ruta tiene esta barra '/' ejemplo: @Path ('/ path') en algunos casos este problema es sólo la barra de falta!