简体   繁体   English

Spring Integration 3.0.1 Restful http-inbound-gateway不会将请求主体转换为对象

[英]Spring Integration 3.0.1 Restful http-inbound-gateway doesn't convert request body into object

I am trying to use Spring Integration (3.0.1) to implement a RESTful service that supports both XML and JSON as request and response formats, using a int-http:inbound-gateway. 我试图使用Spring集成(3.0.1)来实现, 同时支持XML和JSON请求和响应格式,使用INT-HTTP RESTful服务:入站网关。

My code is based on the Spring integration example (although this does not use the message payload): 我的代码基于Spring集成示例(尽管这不使用消息有效负载):

https://github.com/spring-projects/spring-integration-samples/tree/master/intermediate/rest-http https://github.com/spring-projects/spring-integration-samples/tree/master/intermediate/rest-http

Service Activator class: 服务激活类:

@Service("httpOrderGateway")
public class HttpOrderGateway implements OrderGateway {

    private static final Logger LOGGER = Logger.getLogger(HttpOrderGateway.class);

    @Override
    public Message<CreateOrderResponse> createOrder(Message<CreateOrderRequest> orderRequest) {
        LOGGER.info("Received CreateOrderRequest headers: " + orderRequest.getHeaders());
        LOGGER.info("Received: " + orderRequest.getPayload());

        return MessageBuilder.withPayload(new CreateOrderResponse("Thank you for your order")).build();
    }

}

Spring integration XML: Spring集成XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/integration 
                            http://www.springframework.org/schema/integration/spring-integration.xsd
                            http://www.springframework.org/schema/integration/http 
                            http://www.springframework.org/schema/integration/http/spring-integration-http.xsd
                            http://www.springframework.org/schema/oxm 
                            http://www.springframework.org/schema/oxm/spring-oxm.xsd"
       xmlns:int="http://www.springframework.org/schema/integration"
       xmlns:oxm="http://www.springframework.org/schema/oxm"
       xmlns:int-http="http://www.springframework.org/schema/integration/http">

    <int:annotation-config />  

    <int:channel id="orderRequestChannel" />
    <int:channel id="orderResponseChannel" />

    <int-http:inbound-gateway id="inboundOrderRequestGateway" 
                              supported-methods="POST"
                              request-channel="orderRequestChannel"
                              reply-channel="orderResponseChannel"
                              view-name="/order"
                              path="/services/order"
                              reply-timeout="50000">
    </int-http:inbound-gateway>

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="contentNegotiationManager">
            <bean class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
                <property name="defaultContentType" value="application/json" />
                <property name="mediaTypes">
                    <map>
                        <entry key="json" value="application/json" />
                        <entry key="xml" value="application/xml" />
                    </map>
                </property>
            </bean>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="com.anon.order.gateway.json.view.ExtendedMappingJacksonJsonView">
                    <property name="objectMapper" ref="jaxbJacksonObjectMapper" />
                </bean>
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <constructor-arg ref="marshaller" />
                </bean>
            </list>
        </property>
    </bean>

    <oxm:jaxb2-marshaller id="marshaller" contextPath="com.anon.order.gateway.marshalling.model.impl" />

    <int:service-activator id="orderGatewayActivator"
                               input-channel="orderRequestChannel"
                               output-channel="orderResponseChannel"
                               ref="httpOrderGateway" 
                               method="createOrder" 
                               requires-reply="true"
                               send-timeout="60000" />

    <bean id="jaxbJacksonObjectMapper" class="com.anon.order.gateway.json.JaxbJacksonObjectMapper" />

</beans>

Currently, the code logs out: 目前,代码注销:

Received: <CustomerServiceRequest><CustomerName>Robert Pulson</CustomerName></CustomerServiceRequest>

(or the equivalent JSON format), and returns a response in either JSON or XML, depending on the Accept Header, so that part is working. (或等效的JSON格式),并根据Accept Header返回JSON或XML中的响应,以便该部分正常工作。

I have read the following similar question that is based on a previous version of Spring Integration: 我已经阅读了以下基于以前版本的Spring Integration的类似问题:

Spring Integration : http:inbound-channel adapter - not getting json object in payload Spring集成:http:入站通道适配器 - 不在有效负载中获取json对象

But this uses an inbound-channel-adaptor , not an inbound-gateway as I have. 但这会使用inbound-channel-adaptor ,而不是我所拥有的inbound-gateway

How do I configure my inbound-gateway to use the marshaller and jaxbJacksonObjectMapper (from the same configuration file) to convert the raw request body into a CreateOrderRequest instance for both JSON/XML please? 如何配置我的inbound-gateway使用marshallerjaxbJacksonObjectMapper (来自相同的配置文件)将原始请求主体转换为JSON / XML的CreateOrderRequest实例?

Configure appropriate HttpMessageConverter s and inject them using the message-converters attribute. 配置适当的HttpMessageConverter并使用message-converters属性注入它们。

See also the merge-with-default-converters attribute. 另请参见merge-with-default-converters属性。

See MappingJackson2HttpMessageConverter (jackson 2), MappingJacksonHttpMessageConverter (jackson 1.x) and MarshallingHttpMessageConverter . 请参阅MappingJackson2HttpMessageConverter (jackson 2), MappingJacksonHttpMessageConverter (jackson 1.x)和MarshallingHttpMessageConverter

Also, JAXB and Json message converters are automatically used by default if they are on the classpath. 此外,如果它们位于类路径上,则默认情况下会自动使用JAXB和Json消息转换器。 You may be able to just set the request-payload-type on the gateway if conversion doesn't need anything special. 如果转换不需要任何特殊内容,您可以在网关上设置request-payload-type

See the reference documentation for more information. 有关更多信息,请参阅参考文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM