2011-05-24 25 views
6

Estoy tratando de usar jersey con mi propio json MessageBodyReader/MessageBodyWriter (ya que no utilizo @XmlRootElement ... anotaciones en mis clases de dominio).Jersey no ve mi MessageBodyReader

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public final class MyGsonMessageBodyHandler implements MessageBodyWriter<Object>, MessageBodyReader<Object> { 
... 
} 

Jersey utiliza esta clase como messagebumwriter (como se detiene en el punto de corte en el método implementado writeTo). Hovewer no ve esta clase como messagebodyreader (e incluso cuando rompo esta clase a las implementaciones separadas de messagebodyreader/messagebumwriter, todavía se niega a usar mi messagebodyreader).

El código de prueba se ve de la siguiente manera (Jersey-pardo):

final Greeting greeting = resource.path("/greeting") 
      .queryParam("name", name) 
      .accept(MediaType.APPLICATION_JSON) 
      .type(MediaType.APPLICATION_JSON) 
      .get(Greeting.class); 

El error que tengo es el siguiente:

A message body reader for Java class test.Greeting, and Java type class test.Greeting, and MIME media type application/json was not found 

Me pregunto qué tipo de magia que se requiere para la escritura propio MessageBodyReader?

Respuesta

0

No estoy seguro si es su caso, pero el error común es la implementación incorrecta del método isReadable.

¿Lo ha implementado?
¿Se detiene allí cuando se depura?
¿Es verdad?

9

Después de un tiempo encontré una causa raíz del problema. Mi aplicación de MessageBodyReader/escritor está bien (y me funciona muy bien con Restlet), pero si se utiliza JerseyTest, NO olvide añadir su MessageBodyReader/escritor a que es ClientConfig:

/** 
* Creates custom REST client config which is mandatory since we don't use any JSON providers. 
* @return Jersey Client Config with the required classes to read/write in(out)coming data. 
*/ 
private static ClientConfig createClientConfig() { 
    final ClientConfig config = new DefaultClientConfig(); 
    config.getClasses().add(GsonMessageBodyHandler.class); 
    config.getClasses().add(GsonAwareContextResolver.class); 
    return config; 
} 

/** 
* Public ctor 
* @throws com.sun.jersey.test.framework.spi.container.TestContainerException On error 
*/ 
public MyRestExposureTest() throws TestContainerException { 
    super(new WebAppDescriptor.Builder("my.rest.package") 
      .clientConfig(createClientConfig()) 
      .contextPath("/") 
      .build()); 
} 

De lo contrario su código de cliente no podría leer/escribir sus POJO.

+0

estoy usando el jersey 1,17 y esto no funciona para mí. La configuración del cliente nunca se evalúa. – Raffael

3

Esto es lo que estoy usando y está funcionando (actualmente con Jersey 1.8).

public static Client createMyClient() { 
    ClientConfig cc = new DefaultClientConfig(); 
    cc.getClasses().add(MyProviderClass1.class); 
    cc.getClasses().add(MyProviderClass2.class); 
    cc.getClasses().add(MyProviderClass3.class); 
    return Client.create(cc); 
} 
0

Después de probar la solución de Alex, esto finalmente funcionó para mí:

public IntegrationTest() throws TestContainerException { 
    super(new LowLevelAppDescriptor.Builder(createResourceConfig()) 
        .build()); 
} 

private static ResourceConfig createResourceConfig() { 
    ResourceConfig rc = new PackagesResourceConfig("com.github.joschi.jersey.security.smime"); 
    rc.getSingletons().add(new EnvelopedWriter()); 
    rc.getSingletons().add(new SignedWriter()); 
    return rc; 
}