tutorial servlet restful example java rest servlets jersey

servlet - web service rest java eclipse



El método Http GET muestra un error cuando se usa jersey (5)

Estoy siguiendo un tutorial para aprender REST api. A continuación está mi código que tiene la anotación GET y usa el servidor de Weblogic para implementar mi aplicación. Por algún motivo, muestra el siguiente error:

HTTP method GET is not supported by this URL

Sample.java

import javax.ws.rs.*; import javax.ws.rs.core.MediaType; @Path("/v1") public class V1_status { @GET @Produces(MediaType.TEXT_HTML) public String returnTitle(){ return "<p> Yess </p>"; } }

web.xml

<?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_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>com.glasschecker.rest</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <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>com.glasschecker.rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping> </web-app>

Este es el tutorial:

https://www.youtube.com/watch?v=4DY46f-LZ0M&list=PLu47tUtKqNlwfR- nqjiWUaIWOYEi9FyW0 & index = 2

Utilizo la siguiente URL http: // localhost: 7001 / com.glasschecker.rest / api / v1. El patrón de URL se agrega al servlet.

Cuando intento acceder a http: // localhost: 7001 / com.glasschecker.rest , muestra el archivo index.html correctamente (primer archivo en mi web.xml). Estoy seguro de algo en mi archivo.

NOTA la clase java está dentro de este paquete:

com.glasschecker.rest.status

Este es el error que estoy recibiendo:

weblogic.application.ModuleException: weblogic.management.DeploymentException: [HTTP:101170]The servlet org.foo.rest.MyApplication is referenced in servlet-mapping /api but not defined in web.xml. at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140) at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124) at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:237) at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:232) at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45) Truncated. see log file for complete stacktrace Caused By: weblogic.management.DeploymentException: [HTTP:101170]The servlet org.foo.rest.MyApplication is referenced in servlet-mapping /api but not defined in web.xml. at weblogic.servlet.internal.WebAppServletContext.verifyServletMappings(WebAppServletContext.java:1566) at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3066) at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1830) at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:875) at weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360)


Anote su clase con la anotación @Path, ya que JAX-RS runtime lo requiere para tratar su clase como un recurso.


Usted definió la ruta /v1 pero solicitó /api/v1 . tratar:

@Path("/api") public class V1_status { @Path("v1") @GET @Produces(MediaType.TEXT_HTML) public String returnTitle(){ return "<p> Yess </p>"; } }


Aquí está el código de trabajo completo:

@Path("/ws") public class V1_status { @GET @Path("/title") //this one is optional @Produces(MediaType.TEXT_HTML) public String returnTitle(){ return "<p> Yess </p>"; } }

  1. use anotation @Path ("path_name_here") para declarar una ruta de reposo a un recurso.
  2. acceda a su punto final en el uri: http: // localhost: 8080 / ws / title (suponiendo que la ruta del servidor base es: http: // localhost: 8080 )
  3. compruebe la instalación weblogic jax -rs-2.0.war
  4. compruebe que su clase de recurso de servicio web de Rest esté en paquete (declarado con com.sun.jersey.config.property.package )

La propiedad "com.sun.jersey.config.property.package" solo necesita establecerse como el paquete que contiene las clases de servicio web.

En su caso es el paquete de clase "V1_status": "com.glasschecker.rest.status"

<init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.glasschecker.rest.status</param-value> </init-param>

Como se especifica en la documentación de Jersey ServletContainer

if the initialization parameter "com.sun.jersey.config.property.resourceConfigClass" is not present and a initialization parameter "com.sun.jersey.config.property.packages" is present a new instance of PackagesResourceConfig is created. The initialization parameter "com.sun.jersey.config.property.packages" MUST be set to provide one or more package names.

PackagesResourceConfig busca dinámicamente las clases de recurso raíz y proveedor. En este caso, "V1_status" es su recurso raíz.


  1. Elimine el archivo web.xml o borre todos los elementos del mapeo servlet y servlet.
  2. Debería haber una clase ApplicationConfig que extiende la Application . Anota ApplicationPath(''/'') o como quieras.

Aquí hay un ejemplo de la clase ApplicationConfig

@javax.ws.rs.ApplicationPath("/") public class ApplicationConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new java.util.HashSet<>(); addRestResourceClasses(resources); return resources; } /** * Do not modify addRestResourceClasses() method. * It is automatically populated with * all resources defined in the project. * If required, comment out calling this method in getClasses(). */ private void addRestResourceClasses(Set<Class<?>> resources) { resources.add(com.testrest.StuffResource.class); } }