2015-10-05 44 views
0

我正在Glassfish 4.1上制作Java EE 7应用程序(war)。
该应用程序是一个简单的CRUD应用程序。
对于测试CRUD操作,我制作了一个Java SE客户端(使用Jersey2客户端API)。 奇怪的行为是HTTP POST创建不检测对象的一个​​领域:
我有一个“生日”属性,来“”总是在服务器端。
我不明白为什么会发生这种情况,以及如何解决这个问题?Stange RESTful Java EE行为

这里是我正在使用服务器端的依赖关系:

<dependency> 
     <groupId>org.eclipse.persistence</groupId> 
     <artifactId>org.eclipse.persistence.core</artifactId> 
     <version>2.6.0</version> 
     <type>jar</type> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-web-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 

下面是客户端的依赖关系:

<dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-client</artifactId> 
     <version>2.22</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.6.2</version> 
    </dependency> 

这里是在客户端创建块:

Client client = ClientBuilder.newClient(); 
    WebTarget webTarget = client.target("http://localhost:8080/MedicalCenter/rest/customers"); 

    Customer customer = new Customer("Jason", "Bourne", new Date(), "This is description", new ArrayList<Device>()); 

    ObjectMapper mapper = new ObjectMapper(); 

    String mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); 
    result = mapper.writeValueAsString(customer); 

    Response response = webTarget.request("application/json") 
      .post(Entity.entity(result, MediaType.APPLICATION_JSON_TYPE)); 

以下是发送的JSON的示例:

Here is an example {"id":null, 
"name":"Jason", 
"familyName":"Bourne", 
"birthDate":"2015-10-05T21:41:43‌​.044+0000", 
"description":"This is description", 
"creation":"2015-10-05T21:41:43.044+0000", 
"enabled":true, 
"system":t‌​rue, 
"version":null, 
"devices":[]} 

请帮帮我:) 谢谢!

+1

你打印出JSON的样子吗?数据序列化不会出现如何服务器期望。 – leeor

+0

检查以确保没有什么是瞬态的 –

+0

这是什么'String mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);'? – ACV

回答

0

当使用Jersey 1.19客户端软件包创建http post后,情况变得更加陌生。
所以我得到了一个确认,说这是一个在服务器端的反序列化问题的假设是错误的,因为它与球衣1.19客户端捆绑包一起工作。
我重新开始调查,我比较泽西1和泽西岛2客户端两者的JSON输出,并且我发现,所不同的是生日的日期格式:

  • Jeysey 2:“生日”:” 1990-05-04T22:00:00.000 + 0000"
  • 泽西1: “生日”: “2015-10-06T00:24:32.693 + 02:00” < - 这是工作

所以我试图迫使Jersey 2客户端中的DateFormat:

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
//Jackson Object Mapper 
ObjectMapper mapper = new ObjectMapper(); 
mapper.setDateFormat(sdf); 

,这是工作的5/5

下一个问题是调用这个解决办法,为什么只接受格式是这样吗?

希望这种解决方法可以帮助每个有相同问题的人!

+1

需要考虑的一件事是Glassfish中使用的实际默认JSON提供程序是MOXy,而不是Jackson,如[这里]所述(http://stackoverflow.com/a /2587435分之29247558)。 –