我正在尝试序列化消息(然后反序列化它(,我不希望任何标头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();