2016-07-05 2 views
0

Я пытаюсь отобразить непосредственно из и в json. Для запросов GET это работает плавно. Для запросов POST возникает исключение.Jersey 2.x post call with json input paramater throws MessageBodyProviderNotFoundException

методы ресурса:

@GET 
@Path("testget") 
@Produces(MediaType.APPLICATION_JSON) 
public Response test(@Context HttpServletRequest request) { 
    Password password = new Password(); 
    password.setPassword("testpassword"); 
    return Response.status(Response.Status.OK).entity(password).build(); 
} 

@POST 
@Path("testpost") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response test(Password password) { 
    return Response.status(Response.Status.OK).entity(password.getPassword()).build(); 
} 

клиента:

Response reponse = target.request(MediaType.APPLICATION_JSON).get(); 

    Password password = new Password(); 
    password.setPassword("newTestPasswort"); 
    reponse = target.request(MediaType.APPLICATION_JSON).post(Entity.json(password)); 

исключение:

SEVERE: MessageBodyWriter not found for media type=application/json,  type=class com.entities.Password, genericType=class  com.entities.Password. 
Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class com.entities.Password, genericType=class com.entities.Password. 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) 
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:502) 
    at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:388) 
    at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285) 
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:255) 
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684) 
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343) 
    at com.clientsql.RegistrationTest.setNewPassword(RegistrationTest.java:61) 
    at com.clientsql.RegistrationTest.main(RegistrationTest.java:44) 

Зависимости:

<dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
     <version>2.23.1</version> 
    </dependency> 

Для сопоставления я пробовал различные зависимости. Для каждого из них работает только функция получения:

<dependency> 
     <groupId>com.owlike</groupId> 
     <artifactId>genson</artifactId> 
     <version>1.4</version> 
</dependency> 

<!--  <dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.23.1</version> 
</dependency>--> 
<!--  <dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>2.23.1</version> 
</dependency>--> 
+1

Вы должны зарегистрировать поставщик для клиента, чтобы сделать отображение в/из JSON, есть пример использования Genson [здесь] (HTTP : //owlike.github.io/genson/Documentation/Extensions/#jax-rs-jersey--cie). – eugen

ответ

0

Вам необходимо сообщить, как конвертировать объект в/из JSON.

Существует несколько подходов к поддержке JSON в джерси.

Посмотрите официальную документацию Джерси для различных подходов к поддержке JSON: https://jersey.java.net/documentation/latest/media.html#d0e7963

Ниже два общий способ сделать это:

  1. JAXB на основе JSON Поддержка привязки

    Добавить @XmlRootElement аннотация для POJO.

    @XmlRootElement 
    class EntityX { 
        // data 
    } 
    
  2. POJO на основе JSON Поддержка привязки

    Вы должны зарегистрировать поставщика, который реализует ContextResolver. Используя Джексон, вы можете это сделать.

    @Provider 
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
    public class JacksonContextResolver implements ContextResolver<ObjectMapper> { 
    
        private ObjectMapper objectMapper; 
    
        public JacksonContextResolver() throws Exception { 
         this.objectMapper = buildMapper(false); 
        } 
    
        public static ObjectMapper buildMapper(boolean indent) { 
         ObjectMapper objectMapper = new ObjectMapper(); 
         objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH)); 
         AnnotationIntrospector primary = new JacksonAnnotationIntrospector(); 
         AnnotationIntrospector secondary = new JaxbAnnotationIntrospector(); 
         AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary); 
    
         SerializationConfig sc = objectMapper.getSerializationConfig() 
          .withAnnotationIntrospector(pair) 
          .withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); 
         objectMapper.setSerializationConfig(sc); 
    
         if (indent) { 
          objectMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 
         } 
    
         return objectMapper; 
        } 
    
        /** 
        * @see javax.ws.rs.ext.ContextResolver#getContext(java.lang.Class) 
        */ 
        public ObjectMapper getContext(Class<?> objectType) { 
         return objectMapper; 
        } 
    } 
    

    Проверить эту ссылку для получения дополнительной информации: https://jersey.java.net/documentation/latest/media.html#json.jackson

Смежные вопросы