Stange RESTful Java EE 行为
Stange RESTful Java EE behaviour
我正在 Glassfish 4.1 上制作 Java EE 7 应用程序 (war)。
该应用程序是一个简单的 CRUD 应用程序。
为了测试 CRUD 操作,我制作了一个 Java SE 客户端(使用 Jersey2 客户端 api)。
奇怪的行为是 HTTP POST 创建没有检测到对象的一个字段:
我有一个“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":true,
"version":null,
"devices":[]}
请帮助我:)
谢谢!!
当 http post 创建已通过 Jersey 1.19 客户端包时,情况变得更加奇怪。
所以我得到确认,假设说它是服务器端的反序列化问题是不正确的,因为它适用于 jersey 1.19 客户端包。
我重新开始调查并比较了 Jersey 1 和 Jersey 2 客户端的 JSON 输出,我发现不同之处在于 birthDate 的 DateFormat:
- 杰西 2: "birthDate":"1990-05-04T22:00:00.000+0000"
- 泽西岛 1:"birthDate":"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
调用此解决方法的下一个问题,为什么唯一接受的格式是这个?
希望这个解决方法能帮助遇到同样问题的每个人!
我正在 Glassfish 4.1 上制作 Java EE 7 应用程序 (war)。
该应用程序是一个简单的 CRUD 应用程序。
为了测试 CRUD 操作,我制作了一个 Java SE 客户端(使用 Jersey2 客户端 api)。
奇怪的行为是 HTTP POST 创建没有检测到对象的一个字段:
我有一个“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":true,
"version":null,
"devices":[]}
请帮助我:) 谢谢!!
当 http post 创建已通过 Jersey 1.19 客户端包时,情况变得更加奇怪。
所以我得到确认,假设说它是服务器端的反序列化问题是不正确的,因为它适用于 jersey 1.19 客户端包。
我重新开始调查并比较了 Jersey 1 和 Jersey 2 客户端的 JSON 输出,我发现不同之处在于 birthDate 的 DateFormat:
- 杰西 2: "birthDate":"1990-05-04T22:00:00.000+0000"
- 泽西岛 1:"birthDate":"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
调用此解决方法的下一个问题,为什么唯一接受的格式是这个?
希望这个解决方法能帮助遇到同样问题的每个人!