tela - Dependen de las dependencias de HttpServletRequest con Jersey
jersey tela (2)
Las dependencias de servlet se separaron a otro módulo, intente agregar
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.14</version>
</dependency>
a tu pom.
Tengo un servidor Standalone Jersey ejecutándose al comienzo de mi JunitTest. Estoy probando si mi controlador JaxRS funciona, así como mi HttpClient personalizado. Tenga en cuenta que siempre he podido utilizar este JaxRsResourceController incrustado en glassfish.
Aquí está el JaxRsController (versión ligera)
@Path("root")
public class JaxRsResourceController implements
ResourceController<HttpServletRequest> {
@Context
private UriInfo context;
@Context
HttpServletRequest request;
@Context
HttpServletResponse response;
@GET
public String hello(){
System.out.println("Uri is "+this.context.getBaseUri().toString());
return "Hello "+peoples;
}
}
No tengo ningún problema con el cliente, pero cuando inicio el servidor, tengo:
GRAVE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.robustaweb.library.rest.controller.implementation.JaxRsResourceController.request
SEVERE: Missing dependency for field: javax.servlet.http.HttpServletResponse com.robustaweb.library.rest.controller.implementation.JaxRsResourceController.response
at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:172)
at com.robustaweb.library.rest.server.JerseyServer.startServer(JerseyServer.java:44)
Básicamente, dice que en el momento de inyección de @Context, no hay dependencia en HttpServletRequest. Sin embargo, si elimino las anotaciones de @Context a petición y respuesta, pero las guardo para el UriInfo context
, está bien, y puedo leer el Uri.
Cambié algunas veces el Maven pom que ahora es para forzar las libs en:
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.14</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
Alguna idea ?
No fue fácil, pero me enteré. El problema es que en mi prueba JUnit, estaba creando el servidor así:
HttpServer server = HttpServerFactory.create(url);
Pero de esa forma, crea un contenedor liviano que no tiene contenedores de servlets, y también lo es el motivo del error. Entonces, para tenerlo todo, utilicé el jersey-test-framework que permite usar el contenedor web Grizzly (o incluso el Glassfish incrustado).
Aquí está el maven:
<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<!-- Unit test are using jersey server directly -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey.test.framework</groupId>
<artifactId>jersey-test-framework</artifactId>
<version>1.0.3</version>
<scope>test</scope>
</dependency>
</dependencies>
Aquí está el JerseyServerTest: tenga en cuenta que se extiende JerseyTest
public class JerseyServerTest extends JerseyTest {
protected String baseUri = "http://localhost:" + TestConstants.JERSEY_HTTP_PORT + "/";
public JerseyServerTest() throws Exception {
super("com.robustaweb.library.rest.controller");
/*
It''s possible to NOT call the super() but to manually do :
1) ApplicationDescriptor appDescriptor = new ApplicationDescriptor()
.setRootResourcePackageName(resourcePackageName) // resource packages
.setContextPath(contextPath) //context of app
.setServletPath(servletPath); // context of spi servlet
2)setupTestEnvironment(appDescriptor);
*/
}
@Test
public void testHelloWorldRequest() {
SunRestClient client = new SunRestClient(baseUri + "root");
String result = client.GET("", null);
System.out.println(result);
}
@Test
public void testDeleteRequest() {
SunRestClient client = new SunRestClient(baseUri + "root");
String result = client.DELETE("john", null);
System.out.println(result);
}
}
Y finalmente el archivo de recursos, que contiene @GET y @DELETE
@Path("root")
public class JaxRsController extends JaxRsResourceController{
List<String> peoples = new ArrayList<String>();
@GET
public String hello(){
System.out.println("Uri is "+getUri());
return "Hello "+peoples;
}
@DELETE
@Path("{name}")
public String deletePeople(@PathParam("name") String name){
System.out.println("deleting "+name);
this.peoples.remove(name);
return String.valueOf(peoples.size());
}
}
¡Y ahora funciona! Tuve algo de ayuda en este artículo , y hay un pequeño capítulo sobre la documentación . El hecho de poder adjuntar el código fuente del framework de Jersey realmente ayudó, por lo que también ayuda a IntelliJ.