Spring Integration REST 服务同时使用 XML 和 JSON



我想用 Spring Integration v4.2+ 实现以下简单的用例:

  1. 向客户端提供 REST 端点,例如 ( /api/person (。
  2. 客户端可以将数据POST到此终结点。 数据可以以JSON,XML或Google协议缓冲区格式提交。
  3. 应用程序接受数据并将其保存到数据库表中。

我有以下 Spring 集成配置,允许端点接受 JSON 数据:

<int:channel id="receiveChannel"/>
<http:inbound-channel-adapter id="restInputAdapter"
                            channel="receiveChannel"
                            path="/api/person"
                            request-payload-type="java.util.Map"
                            supported-methods="POST"/>
<jdbc:outbound-channel-adapter id="jdbcOutputAdapter"
                             channel="receiveChannel"
                             data-source="dataSource"
                             query='INSERT INTO "person" ("first_name", "last_name", "email_address") VALUES (:payload[firstName], :payload[lastName], :payload[email])'/>

这是在类路径上有 Jackson2 的 Maven 项目中,这就是为什么从请求中读取 JSON 不需要特殊配置的原因。

但是,尝试发布 XML 数据会导致以下异常:

org.springframework.messaging.MessagingException: Could not convert request: no suitable HttpMessageConverter found for expected type [java.util.Map] and content type [application/xml]]

我尝试将 message-converters 属性与 http:inbound-channel-adapter 一起使用,明确指定杰克逊、JAXB 和协议缓冲区转换器,但这也没有帮助。

我知道如何在带有@RestController s的定制Spring MVC应用程序中执行此操作,因此我不是在Spring Integration之外寻找解决方案。

如何调整上面的 Spring 集成配置,以便使 REST 端点同时接受 JSON、XML 和 Google Protocol Buffers?

看起来虽然

JSON可以转换为java.util.Map,但XML不会。 这就是看到错误的原因。

我创建了一个类:

@XmlRootElement class Person { ... }

然后按如下方式修改配置(仅显示更改(:

<http:inbound-channel-adapter ...
                        request-payload-type="Person"
                        .../>
<jdbc:outbound-channel-adapter ...
                         query='INSERT INTO "person" ("first_name", "last_name", "email_address") VALUES (:payload.firstName, :payload.lastName, :payload.email)'
                        .../>

现在,我可以将 XML 和 JSON 数据发布到端点。

Google Protocol Buffers 支持现在可以使用 Protostuff 库添加。

最新更新