对于最新的稳定版本,请使用 Spring Integration 6.4.3! |
Http 入站组件
要通过 HTTP 接收消息,您需要使用 HTTP 入站通道适配器或 HTTP 入站网关。
要支持 HTTP 入站适配器,需要将它们部署在 servlet 容器(如 Apache Tomcat 或 Jetty)中。
最简单的方法是使用 Spring 的HttpRequestHandlerServlet
,通过在web.xml
文件:
<servlet>
<servlet-name>inboundGateway</servlet-name>
<servlet-class>o.s.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>
请注意,Servlet 名称与 Bean 名称匹配。
有关更多信息,请参阅HttpRequestHandlerServlet
Javadocs 的 Java 文档。
如果你在 Spring MVC 应用程序中运行,那么上述显式 servlet 定义就不是必需的。 在这种情况下,网关的 Bean 名称可以与 URL 路径匹配,就像对 Spring MVC 控制器 Bean 所做的那样。 有关更多信息,请参阅 Web MVC 框架,它是 Spring 框架参考文档的一部分。
有关示例应用程序和相应的配置,请参阅 Spring 集成示例存储库。 它包含 HTTP 示例应用程序,该应用程序演示了 Spring 集成的 HTTP 支持。 |
以下示例 Bean 定义了一个 HTTP 入站端点:
<bean id="httpInbound"
class="org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway">
<property name="requestChannel" ref="httpRequestChannel" />
<property name="replyChannel" ref="httpReplyChannel" />
</bean>
这HttpRequestHandlingMessagingGateway
接受HttpMessageConverter
instances 否则依赖于 default 列表。
转换器允许自定义HttpServletRequest
自Message
.
默认转换器封装了简单的策略,例如,这些策略会创建一个String
message 的POST
内容类型开头的请求text
.
有关完整详细信息,请参阅 Javadoc。
附加标志 (mergeWithDefaultConverters
) 可以与 list 一起设置自定义HttpMessageConverter
以在 Custom Converters(自定义转换器)之后添加 Default Converters(默认转换器)。
默认情况下,此标志设置为false
,这意味着自定义转换器将替换默认列表。
消息转换过程使用(可选)requestPayloadType
属性和传入的Content-Type
页眉。
从版本 4.3 开始,如果请求没有内容类型标头,application/octet-stream
假设,如RFC 2616
.
以前,此类消息的正文被忽略。
Spring Integration 2.0 实现了多部分文件支持。
如果请求已包装为MultipartHttpServletRequest
,当您使用默认转换器时,该请求将转换为Message
payload 的MultiValueMap
包含的值可以是字节数组、字符串或 Spring 的MultipartFile
,具体取决于各个部分的内容类型。
HTTP 入站端点会找到一个MultipartResolver 在上下文中,如果 bean 名称为multipartResolver (与 Spring 的DispatcherServlet ).
如果它确实找到了该 bean,则会在入站请求映射器上启用对 multipart 文件的支持。
否则,当它尝试将 multipart 文件请求映射到 Spring 集成时,它将失败Message .
有关 Spring 对MultipartResolver ,请参阅 Spring Reference Manual。 |
如果您希望代理
|
当您向客户端发送响应时,您可以通过多种方式自定义网关的行为。
默认情况下,网关通过发送200
状态代码返回。
可以通过提供 Spring MVC 解析的 'viewName' 来自定义此响应ViewResolver
.
如果网关应该期望收到对Message
中,您可以设置expectReply
flag(构造函数参数)使网关等待回复Message
在创建 HTTP 响应之前。
下面的示例将网关配置为用作具有视图名称的 Spring MVC 控制器:
<bean id="httpInbound"
class="org.springframework.integration.http.inbound.HttpRequestHandlingController">
<constructor-arg value="true" /> <!-- indicates that a reply is expected -->
<property name="requestChannel" ref="httpRequestChannel" />
<property name="replyChannel" ref="httpReplyChannel" />
<property name="viewName" value="jsonView" />
<property name="supportedMethodNames" >
<list>
<value>GET</value>
<value>DELETE</value>
</list>
</property>
</bean>
由于constructor-arg
的值true
,则等待回复。
前面的示例还显示了如何自定义网关接受的 HTTP 方法,这些方法是POST
和GET
默认情况下。
回复消息在模型映射中可用。 默认情况下,该映射条目的键是 'reply',但您可以通过在终端节点的配置上设置 'replyKey' 属性来覆盖此默认值。
有效载荷验证
从版本 5.2 开始,HTTP 入站端点可以被提供Validator
在发送到通道之前检查 payload。
此有效负载已经是 after 转换和提取的结果payloadExpression
缩小与有价值数据相关的验证范围。
验证失败的处理与我们在 Spring MVC 错误处理中的处理完全相同。