我想用 Spring Integration v4.2+ 实现以下简单的用例:
- 向客户端提供 REST 端点,例如 (
/api/person
(。 - 客户端可以将数据
POST
到此终结点。 数据可以以JSON,XML或Google协议缓冲区格式提交。 - 应用程序接受数据并将其保存到数据库表中。
我有以下 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 库添加。