restful library jax example java rest jax-rs embedded-server

java - library - JAX-RS con servidor incorporado



restful example java (3)

Aclaración: esta pregunta era sobre GZIPping un servicio REST basado en JAX-WS, pero he decidido cambiar el tema para que sea más fácil de encontrar

Estoy implementando un servicio REST a través del Provider <Source> JAX-WS Provider <Source> , y lo publico con un Endpoint estándar (la razón es que quiero evitar el uso de un contenedor de servlets o un servidor de aplicaciones).

¿Hay una manera de hacer que el servidor responda al contenido de la respuesta gzip, si Accept-Encoding: gzip está presente?

CÓMO

Las muestras proporcionadas por nicore realmente funcionan y le permiten hacer un servidor de estilo JAX-RS sobre un servidor ligero incorporado sin contenedor de servlets, pero hay algunos momentos que deben considerarse.

Si prefiere administrar las clases por su cuenta (y ahorrar un tiempo durante el inicio), puede usar lo siguiente:

Ejemplo

JAX-RS hola clase mundial:

@Path("/helloworld") public class RestServer { @GET @Produces("text/html") public String getMessage(){ System.out.println("sayHello()"); return "Hello, world!"; } }

Método principal:

Para servidor Simple :

public static void main(String[] args) throws Exception{ DefaultResourceConfig resourceConfig = new DefaultResourceConfig(RestServer.class); // The following line is to enable GZIP when client accepts it resourceConfig.getContainerResponseFilters().add(new GZIPContentEncodingFilter()); Closeable server = SimpleServerFactory.create("http://0.0.0.0:5555", resourceConfig); try { System.out.println("Press any key to stop the service..."); System.in.read(); } finally { server.close(); } }

Para Grizzly2 :

public static void main(String[] args) throws Exception{ DefaultResourceConfig resourceConfig = new DefaultResourceConfig(RestServer.class); // The following line is to enable GZIP when client accepts it resourceConfig.getContainerResponseFilters().add(new GZIPContentEncodingFilter()); HttpServer server = GrizzlyServerFactory.createHttpServer("http://0.0.0.0:5555" , resourceConfig); try { System.out.println("Press any key to stop the service..."); System.in.read(); } finally { server.stop(); } }

Dependencias resueltas:

Sencillo:

Oso pardo:

Jersey:

darse cuenta

Asegúrese de que el archivo javax.ws.rs entrado en su classpath, ya que entra en conflicto con la implementación de Jersey. Lo peor aquí es un error 404 silencioso sin registro, solo se registra una pequeña nota en el nivel FINER .


Si realmente quiere hacer REST con Java, le sugiero que utilice una implementación JAX-RS (RESTeasy, Jersey ...).

Si su principal preocupación es la dependencia de un contenedor de servlets, puede usar JAX-RS RuntimeDelegate para registrar su aplicación como un punto final JAX-RS.

// Using grizzly as the underlaying server SelectorThread st = RuntimeDelegate.createEndpoint(new MyApplication(), SelectorThread.class); st.startEndpoint(); // Wait... st.stopEndpoint();

Con respecto a la codificación GZIP , cada proveedor de JAX-RS tiene diferentes enfoques. Jersey proporciona un filtro para realizar la codificación de forma transparente. RESTEasy proporciona una anotación para eso .

EDITAR

Hice algunas pequeñas pruebas. Las siguientes dos cosas definitivamente funcionarán para usted, asumiendo que está usando Maven .

Usando Jersey + SimpleServer :

public static void main( String[] args ) throws Exception { java.io.Closeable server = null; try { // Creates a server and listens on the address below. // Scans classpath for JAX-RS resources server = SimpleServerFactory.create("http://localhost:5555"); System.out.println("Press any key to stop the service..."); System.in.read(); } finally { try { if (server != null) { server.close(); } } finally { ; } } }

con dependencias maven

<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-simple-server</artifactId> <version>1.10</version> </dependency>

O usando el Jersey + Grizzly2 :

public static void main(String[] args) throws Exception { HttpServer server = null; try { server = GrizzlyServerFactory.createHttpServer("http://localhost:5555"); System.out.println("Press any key to stop the service..."); System.in.read(); } finally { try { if (server != null) { server.stop(); } } finally { ; } } }

con dependencias maven

<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-grizzly2</artifactId> <version>1.10</version> </dependency>

Hablando RuntimeDelegate , tampoco pude hacer funcionar la muestra RuntimeDelegate . Ciertamente, también hay una manera de iniciar RESTEasy fuera de la caja, pero no puedo recordarlo en este momento.


Si usa CXF para su implementación JAX-WS (o JAX-RS), simplemente podría agregar la anotación @GZIP en la clase de servicio.


gzipping la salida es la responsabilidad de la implementación de JAX WS. Debe consultar la documentación del servidor (Tomcat, Glassfish, JBoss, etc.) para configurar sus escuchas de la red http.