Stange RESTful Java EE行为

时间:2015-10-05 21:38:19

标签: java json rest jersey jersey-2.0

我正在Glassfish 4.1上制作一个Java EE 7应用程序(战争) 该应用程序是一个简单的CRUD应用程序。
为了测试CRUD操作,我创建了一个Java SE Client(使用Jersey2客户端api)。 奇怪的行为是HTTP POST Creation没有检测到对象的一个​​字段:
我有一个“ birthDate ”属性,它始终位于服务器端“ null ”。
我不明白为什么会发生这种情况以及如何解决这个问题?

以下是我在服务器端使用的依赖项:

    <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 个答案:

答案 0 :(得分:0)

当使用Jersey 1.19客户端捆绑包创建http帖子时,情况变得更加奇怪 所以我得到了一个确认,即假设它是服务器端的反序列化问题是不正确的,因为它适用于jersey 1.19客户端包。
我重新开始调查,我比较了Jersey 1和Jersey 2客户端的JSON输出,我发现不同之处是birthDate的DateFormat:

  • Jeysey 2:&#34; birthDate&#34;:&#34; 1990-05-04T22:00:00.000 + 0000&#34;
  • Jersey 1:&#34; birthDate&#34;:&#34; 2015-10-06T00:24:32.693 + 02:00&#34; &lt; - 这是有效的

所以我试图在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

调用此变通办法的下一个问题,为什么唯一可接受的格式是这个?

希望这种解决方法能够帮助所有遇到同样问题的人!