在 spring 集成中强制使用 java 类型是否需要任何其他属性

Is any additional attributes required to force the java type in spring integration

我们正在使用 spring-集成(基于 xml 的配置),其中我们正在执行以下步骤

  1. 将负载(java-对象)转换为json
  2. 剩下的api打电话
  3. 转换回 java-object
<int:object-to-json-transformer content-type="test.Request" input-channel="objectToJsonChannel" output-channel="apiChannel"/>
       <int-http:outbound-gateway id="apiChannel"
            request-channel="apiChannel"
            reply-channel="jsonToObjectChannel"
                        ....
            />
         <int:json-to-object-transformer type="test.Response" input-channel="jsonToObjectChannel" output-channel="responseChannel"/>

以上代码适用于 spring-集成版本 5.1。当我升级到 5.2.它开始抛出异常 org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [test.Request] to type [test.Response]

我注意到 object-to-json-transformer 在页眉上添加了 class 关键字 json__TypeId__。然后它将 class 类型用于 json-to-object-transformer

但是json-to-object-transformer中提到的类型属性如果提到应该使用。

请提出解决这个问题的建议,或者它真的是 spring 集成 (5.2) 的错误。

考虑在调用 REST 服务之前添加 <header-filter header-names="json_*" /><int:object-to-json-transformer> 填充 JsonHeaders 让下游知道我们在有效负载中 curry 的 JSON 的真实类型。

A <int:json-to-object-transformer> 更喜欢那些 header 而不是静态 type 选项。 但是由于 payload 已经是与那些请求 header 不同的表示,所以它做了错误的事情。

我会建议 <int:json-to-object-transformer> 上的一个选项来做出偏好,但这并不完全合乎逻辑。由于我们已经更改了一个有效负载,因此最好更改其各自的 headers。否则我们就是在自欺欺人。

另一方面,HTTP 出站网关可以负责将请求转换为 JSON 网络请求,然后从 JSON 响应返回到某些 POJO 类型。

参见 https://docs.spring.io/spring-integration/docs/5.2.3.RELEASE/reference/html/http.html#http-outbound 及其 expected-response-type。只要 contentType header 是 application/json,你最好避免那些 <int:object-to-json-transformer> & <int:json-to-object-transformer>.