Spring 集成:如何配置 ObjectToJsonTransformer 以使用 class 名称而不是规范名称添加 json__TypeId__

Spring Integration: how to configure ObjectToJsonTransformer to add json__TypeId__ with class name instead of canonical name

我正在尝试序列化一条消息(然后将其反序列化),我不希望 header 中的任何一个 json__TypeId__ 或 json_resolvableType 包含 class。 这是因为我正在通过网络发送消息,我认为在 header 中包含规范名称是一个安全问题。

这里只是我正在使用的代码的相关部分:

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}]

我希望它像下面这样,只包含 class 名称:

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

甚至根本没有 json__TypeId__ header:

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

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

创建一个 class 来扩展 jackson 映射器并覆盖 populateJavaTypes(首先添加 header)

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

然后序列化为:

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

注意:我使用的是spring-integration-core 5.2.3.RELEASE

您可以从转换后的邮件中创建新邮件并删除不需要的邮件头

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

参见 Header 过滤器组件:https://docs.spring.io/spring-integration/docs/current/reference/html/message-transformation.html#header-filter

不清楚为什么要直接使用 transform() API,而不是作为集成流程的配置,但您肯定可以从 HeaderFilter 功能中获益.

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