云端点不尊重杰克逊注释
cloud endpoint not respecting Jackson annotations
我有一个 class 组织,其中 date
个字段如下。
public class Organization {
private String _id;
private String name;
@JsonDeserialize(using=JsonDateDeserializer.class)
@JsonSerialize(using=JsonDateSerializer.class)
private Date createdTime;
// getters and setters
}
为了在客户端以简单的方式处理日期,我将 date
转换为 long
并使用这些 JsonSerializer 将其发送给客户端,如下所示
public class JsonDateSerializer extends JsonSerializer<Date>{
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
gen.writeNumber(date.getTime());
}
}
我有一个端点将执行 get organization 并像这样将结果插入响应映射。
@ApiMethod(name="organization.get", path="organizations/{organizationId}", httpMethod=HttpMethod.GET)
public Map<String, Object> organizationDetails(@Named("organizationId") String organizationId){
Organization org = DB.getOrganization("123");
Map<String, Object> response = new HashMap<String, Object>();
response.put("status", HttpServletResponse.SC_OK);
response.put("success", true);
response.put("entity", org);
return response;
}
但我在客户端看到的最终结果 JSON 是
{
"status" : 200,
"entity" : [ {
"_id" : "966a03b3-8e46-41ee-b330-6533409b2b4a",
"name" : "POKURI",
"createdTime" : "2015-05-16T15:02:31.499+05:30"
} ],
"success" : true
}
此处日期采用某种格式而不是长格式。如果我在不使用云端点的情况下使用 Jackson ObjectMapper
进行相同的转换,我将以预期的方式获得响应。为什么云端点不尊重 Jackson 注释?有办法配置吗?
注意:即使我观察到如果您使用云端点,long
也会作为字符串出现在客户端。我正在使用 appengine SDK 1.9.19
您不应该将 Jackson 注释与端点一起使用(如果您这样做,则必须使用重新打包的版本,而不是您自己的版本)。你可以用 @ApiResourceProperty
或 @ApiTransformer
做你想做的事,这取决于你想怎么做。请参阅注释文档 here。
关于 long
,由于浮点不精确,它被序列化为字符串——使用双精度数不可能准确地表示 long 的所有值,这就是 JavaScript 和 JSON.parse
将存储一个数字,所以它总是作为一个字符串传输。我们的任何端点客户端库都会自动将它们转换为正确的数据类型。
我有一个 class 组织,其中 date
个字段如下。
public class Organization {
private String _id;
private String name;
@JsonDeserialize(using=JsonDateDeserializer.class)
@JsonSerialize(using=JsonDateSerializer.class)
private Date createdTime;
// getters and setters
}
为了在客户端以简单的方式处理日期,我将 date
转换为 long
并使用这些 JsonSerializer 将其发送给客户端,如下所示
public class JsonDateSerializer extends JsonSerializer<Date>{
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
gen.writeNumber(date.getTime());
}
}
我有一个端点将执行 get organization 并像这样将结果插入响应映射。
@ApiMethod(name="organization.get", path="organizations/{organizationId}", httpMethod=HttpMethod.GET)
public Map<String, Object> organizationDetails(@Named("organizationId") String organizationId){
Organization org = DB.getOrganization("123");
Map<String, Object> response = new HashMap<String, Object>();
response.put("status", HttpServletResponse.SC_OK);
response.put("success", true);
response.put("entity", org);
return response;
}
但我在客户端看到的最终结果 JSON 是
{
"status" : 200,
"entity" : [ {
"_id" : "966a03b3-8e46-41ee-b330-6533409b2b4a",
"name" : "POKURI",
"createdTime" : "2015-05-16T15:02:31.499+05:30"
} ],
"success" : true
}
此处日期采用某种格式而不是长格式。如果我在不使用云端点的情况下使用 Jackson ObjectMapper
进行相同的转换,我将以预期的方式获得响应。为什么云端点不尊重 Jackson 注释?有办法配置吗?
注意:即使我观察到如果您使用云端点,long
也会作为字符串出现在客户端。我正在使用 appengine SDK 1.9.19
您不应该将 Jackson 注释与端点一起使用(如果您这样做,则必须使用重新打包的版本,而不是您自己的版本)。你可以用 @ApiResourceProperty
或 @ApiTransformer
做你想做的事,这取决于你想怎么做。请参阅注释文档 here。
关于 long
,由于浮点不精确,它被序列化为字符串——使用双精度数不可能准确地表示 long 的所有值,这就是 JavaScript 和 JSON.parse
将存储一个数字,所以它总是作为一个字符串传输。我们的任何端点客户端库都会自动将它们转换为正确的数据类型。