Spring Integration:如何配置ObjectToJsonTransformer以类名而不是规范名添加jso



我正在尝试序列化消息(然后反序列化它(,我不希望任何标头json_TypeId__或json_sresolvableType包含类的规范名称。这是因为我通过网络发送消息,并且我认为在标头中包含规范名称是一个安全问题。

以下是我正在使用的代码的相关部分:

package com.test;
@Getter
@ToString
class CustomObject {
String field;
}

将其序列化为:

Message<?> serialized = Transformers.toJson().transform(MessageBuilder.withPayload(new CustomObject()).build());

序列化的消息如下所示:

GenericMessage [payload={"field":null}, headers={id=496c110d-fdde-b03b-42c0-21f9671e29ed, json_resolvableType=com.test.CustomObject, json__TypeId__=class com.test.CustomObject, contentType=application/json, timestamp=1623417277287}]

我更喜欢下面这样的,只包含类名:

GenericMessage [payload={"field":null}, headers={id=496c110d-fdde-b03b-42c0-21f9671e29ed, json__TypeId__=CustomObject, contentType=application/json, timestamp=1623417277287}]

或者甚至根本没有json_TypeId__标头:

GenericMessage [payload={"field":null}, headers={id=496c110d-fdde-b03b-42c0-21f9671e29ed, contentType=application/json, timestamp=1623417277287}]

我有一个临时解决方案,但我想知道是否有更优雅的解决方案,比如注释或配置。以下是当前解决此问题的程序化方法。

创建一个扩展jackson映射程序的类,并覆盖populateJavaTypes(它首先添加了头(

class JsonObjectMapperCustom extends Jackson2JsonObjectMapper {
@Override
public void populateJavaTypes(Map<String, Object> map, Object object) {
}
}

然后用序列化

Message<?> serialized = new ObjectToJsonTransformer(new JsonObjectMapperCustom()).transform(message);

注:我使用的是弹簧集成核心5.2.3.RELEASE

请参阅Header Filter组件:https://docs.spring.io/spring-integration/docs/current/reference/html/message-transformation.html#header-过滤器。

目前尚不清楚为什么要直接使用transform()API,而不是将其作为集成流的配置,但您肯定可以从HeaderFilter功能中获得好处。

考虑学习什么是消息流,以及如何将它们与介于两者之间的通道组合在一起。所有信息都存在于文档和EIP Book中:https://www.enterpriseintegrationpatterns.com/

您可以从转换后的消息中创建新消息,并删除不需要的标头

Message<?> serialized = MessageBuilder.fromMessage(Transformers.toJson()
.transform(MessageBuilder
.withPayload(new CustomObject())
.build()))
.removeHeaders("json_resolvableType", "json__TypeId__")
.build();

最新更新