【问题标题】:cloud endpoint not respecting Jackson annotations云端点不尊重杰克逊注释
【发布时间】:2015-07-28 08:13:07
【问题描述】:

我有一个类组织,其中 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());
    }

}

我有一个端点,它将执行获取组织并将结果插入到这样的响应图中。

@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

【问题讨论】:

    标签: java json google-app-engine jackson google-cloud-endpoints


    【解决方案1】:

    您不应该将 Jackson 注释与 Endpoints 一起使用(如果这样做,您必须使用重新打包的版本,而不是您自己的版本)。你可以用@ApiResourceProperty@ApiTransformer 做你想做的事,这取决于你想怎么做。请参阅注解文档here

    关于long,由于浮点不精确,它被序列化为字符串——不可能使用double准确表示long的所有值,这是JavaScript和JSON.parse将存储数字的内容,所以它总是作为字符串传输。我们的任何端点客户端库都会自动将它们转换为正确的数据类型。

    【讨论】:

    • 谢谢。将开始使用 @ApiTransformer 将 Date 转换为 long ,反之亦然。而且我必须在使用 Angular JS(我从中进行 REST 调用)实现的客户端上处理很长时间。
    • 但是我在日志上看到警告如果我使用重新打包的包 Jackson,我的应用程序将随时停止工作。
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多