gpt4 book ai didi

java - Spring 4 中的 ObjectToJsonTransformer 在具有 null 值时抛出 NPE

转载 作者:行者123 更新时间:2023-11-30 02:54:31 24 4
gpt4 key购买 nike

我正在使用 Spring 集成处理 JSON 消息。该消息的格式可能有所不同,我对收到的整个 JSON 的特定子对象(称为 payload )感兴趣。我将该子对象的 Java 类与收到的消息中的另一个字段 ( type ) 进行匹配,以便了解如何反序列化它。

为了实现此目的,我将消息转换为 java.lang.Object使用<int:json-to-object-transformer type="java.lang.Object" /> - 这实际上会将初始 JSON 转换为 LinkedMap我可以在 spring 集成 xml 中查询字段并执行过滤和路由的对象 - 例如:

<int:recipient-list-router input-channel="jsonInputChannel" ignore-send-failures="false" default-output-channel="fallbackChannel">
<int:recipient
channel="validInputChannel"
selector-expression="payload.containsKey('type') and payload.containsKey('payload')"/>
</int:recipient-list-router>

上面的payload被视为 Map目的。然后我提取出我需要进一步转换为特定Java类的相关对象:

<int:chain input-channel="validInputChannel" output-channel="objectResolveChannel">
<int:transformer expression="payload.get('payload')" />
<int:object-to-json-transformer />
</int:chain>

当消息的有效负载属性看起来像 {"field1": null, "field2": "something", ....} 时,我收到 NPE

我查看了 Spring 4.2.4.RELEASE 源代码,可以看到 ObjectToJsonTransformer来电 this.jsonObjectMapper.populateJavaTypes(headers, message.getPayload());这是为了调用JsonObjectMapperAdapter中的方法实现。 ,如下:

public void populateJavaTypes(Map<String, Object> map, Object object) {
map.put(JsonHeaders.TYPE_ID, object.getClass());
if (object instanceof Collection && !((Collection) object).isEmpty()) {
map.put(JsonHeaders.CONTENT_TYPE_ID, ((Collection) object).iterator().next().getClass());
}
if (object instanceof Map && !((Map) object).isEmpty()) {
map.put(JsonHeaders.CONTENT_TYPE_ID, ((Map) object).values().iterator().next().getClass());
map.put(JsonHeaders.KEY_TYPE_ID, ((Map) object).keySet().iterator().next().getClass());
}
}

您可以看到,当对象被视为 Map 实例时,代码使用 getClass()在 map 值的第一个元素上,但这当然可以是 null因此 NPE 被抛出。

我们之前将 Spring 3.2.1.RELEASE 与 Spring Integration 2.2.6.RELEASE 一起使用,并且相同的 Spring 集成 XML 配置运行良好。据我所知,上面有问题的代码在 Spring 3 中不存在。

有人可以建议一个解决此问题的好方法或返回 Spring 3 行为的方法吗?

最佳答案

这是一个错误;我开了一个JIRA Issue .

我认为,唯一的解决方法是在本地修复该错误(子类 ObjectToJsonTransformer ,通过删除 doTransform() 调用来修复 populateJavaTypes )并替换 <object-to-json-transformer/>正常 <transformer/>引用您的 bean。

填充 java 类型 header 为 added in 3.0 .

关于java - Spring 4 中的 ObjectToJsonTransformer 在具有 null 值时抛出 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com