jax example consume java json jersey jetty jax-rs

java - example - Creación de ResourceConfig que se comporta de la misma manera que el registro de Jetty''s Jersey por defecto



return json java rest (1)

No sé cómo conseguiste que esto funcione

ServletHolder holder = new ServletHolder(new ServletContainer());

No pude producir un ejemplo de trabajo simplemente instanciando el ServletContainer() . Aunque estaba a punto de hacerlo funcionar con el siguiente código

public class TestJerseyServer { public static void main(String[] args) throws Exception { ResourceConfig config = new ResourceConfig(); config.packages("jetty.practice.resources"); ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(config)); Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(server, "/"); context.addServlet(jerseyServlet, "/*"); server.start(); server.join(); } }

Usando todas sus dependencias, excluyendo el com.sun.jersey:jersey-json , ya que no es necesario. Ninguna otra configuración La clase de recursos

@Path("test") public class TestResource { @GET @Produces(MediaType.APPLICATION_JSON) public Response getTest() { Hello hello = new Hello(); hello.hello = "world"; return Response.ok(hello).build(); } @POST @Consumes(MediaType.APPLICATION_JSON) public Response postHello(Hello hello) { return Response.ok(hello.hello).build(); } public static class Hello { public String hello; } }

en el paquete jetty.practice.resources .

Tengo curiosidad por ver cómo lograste que funcione sin ResourceConfig

Otra cosa que debería mencionar es que jersey-container-servlet-core debe cambiarse por jersey-container-servlet . El primero es para 2.5 contenedores de soporte, pero este último se recomienda para contenedores 3.x. Sin embargo, no tiene ningún efecto, con mi ejemplo

rizo

C:/>curl http://localhost:8080/test -X POST -d "{/"hello/":/"world/"}" -H "Content-Type:application/json"

world

C:/>curl http://localhost:8080/test

{"hello":"world"}

Tengo un punto final con:

@POST @Path("/test") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public String canaryTest(String JSON) { return JSON; }

Cuando lo registro en Jetty usando Jersey

ServletHolder holder = new ServletHolder(new ServletContainer());

Todo parece funcionar bien. Pero en caso de que trate de especificar explícitamente la configuración predeterminada, deja de funcionar (devolviendo un error de tipo de medio desde el punto final). Incluso al pasar una instancia predeterminada de ResourceConfig al ServletContainer, deja de funcionar.

ResourceConfig config = new ResourceConfig(); //config.property(x,defaultX) //config.property(y,defaultY) ServletHolder holder = new ServletHolder(new ServletContainer(config));

Me gustaría emular el comportamiento de configuración predeterminado de forma manual y explícita, entonces lo que estoy preguntando aquí es cómo debo configurar ResourceConfig para que el comportamiento siga funcionando (es decir, qué propiedades establecer)

PD: estoy usando Jetty 9.2.6.v20141205 y Jersey 2.14. Dependencias en Maven:

  • org.eclipse.jetty.jetty-server org.eclipse.jetty.jetty-servlet
  • org.eclipse.jetty.jetty-servlets
  • org.glassfish.jersey.containers.jersey-container-servlet-core
  • com.sun.jersey.jersey-json
  • org.glassfish.jersey.media.jersey-media-json-jackson