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

时间:2016-02-16 08:26:15

标签: spring-integration

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

  1. 向客户端提供REST端点,例如(/api/person)。
  2. 客户端可以POST数据到此端点。数据可以用JSON,XML或Google Protocol Buffers格式提交。
  3. 应用程序接受数据并将其保存到数据库表中。
  4. 我有以下Spring Integration配置,允许端点接受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一起使用,明确指定了Jackson,JAXB和Protocol Buffers转换器,但这也无济于事。

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

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

1 个答案:

答案 0 :(得分:0)

虽然JSON转换为java.util.Map,但似乎并非如此。这就是看到错误的原因。

我创建了一个类:

@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数据发布到端点。

现在可以使用Protostuff library添加Google协议缓冲区支持。