2016-07-05 38 views
0

我嘗試從json直接映射到json。對於GET請求,這個過程很順利。對於POST請求發生異常。澤西2.x後調用json輸入參數拋出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