[英]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
使用marshaller
和jaxbJacksonObjectMapper
(来自相同的配置文件)将原始请求主体转换为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.