Jackson ObjectMapper - 指定对象属性的序列化顺序

新手上路,请多包涵

我正在实施一个 RESTful Web 服务,其中用户必须连同请求一起发送一个签名的验证令牌,以便我可以确保该请求没有被中间人篡改。我目前的实现如下。

Verification token 是一个 VerifData 对象,序列化为 String,然后进行散列和加密。

 class VerifData {
    int prop1;
    int prop2;
}

在我的服务中,我将要序列化的数据放入 VerifData 的一个实例中,然后使用 Jackson ObjectMapper 将其序列化,并连同验证令牌一起传递给验证引擎。

 VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);

但是似乎每次启动应用程序容器时,ObjectMapper 将属性映射到字符串的顺序都会发生变化。

例如:有一次会是

{"prop1":12345,"prop2":67890}

另一次是

{"prop2":67890,"prop1":12345}

因此,如果客户端将 VerifData 实例序列化为第一个字符串,即使它是正确的,也有 50% 的机会失败。

有办法解决这个问题吗?我可以指定 ObjectMapper 映射的属性顺序(如升序)吗?或者有没有其他方法可以最好地实施此验证步骤。客户端和服务器实现都是我开发的。我使用 Java Security API 进行签名和验证。

原文由 Lizzy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

来自 Jackson Annotations 文档

 // ensure that "id" and "name" are output before other properties
@JsonPropertyOrder({ "id", "name" })

// order any properties that don't have explicit setting using alphabetic order
@JsonPropertyOrder(alphabetic=true)

原文由 wgitscht 发布,翻译遵循 CC BY-SA 4.0 许可协议

注释很有用,但在任何地方应用起来都会很痛苦。您可以配置整个 ObjectMapper 以这种方式工作

当前杰克逊版本:

objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)

较旧的杰克逊版本:

objectMapper.configure(SerializationConfig.Feature.SORT_PROPERTIES_ALPHABETICALLY, true);

原文由 Duncan McGregor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题