Spring集成| HTTP出站网关|多

时间:2017-12-22 13:54:03

标签: spring spring-boot spring-integration multipartform-data

  • 服务A接收文件
  • 服务A执行业务逻辑。
  • 服务B公开HTTP入站以接收文件并发布 到S3。
  • 服务A使用http出站网关呼叫服务B.

我收到错误,当服务A使用http出站网关呼叫服务B时无法找到合适的消息转换器。

<int:header-enricher input-channel="addHeader" output-channel="s3publishWithHeader">`


<int:header name="Content-Type" value="multipart/form-data" overwrite="true"/> </int:header-enricher>`

<util:list id="converters">
   <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
   <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
</util:list>`



<http:outbound-gateway request-channel="s3publishWithHeader"
                         http-method="POST" url="http://localhost:8090/com/api/upload"
                          extract-request-payload="true" message-converters="converters"
   ></http:outbound-gateway>

Spring Integration版本:4.3.12

2 个答案:

答案 0 :(得分:2)

使用Resource多部分时,此资源具有文件名似乎至关重要,否则我发现接收服务器抱怨该部分不存在。

将成为多部分请求正文的MultiValueMap可以包含HttpEntity个部分,您可以在其中更精确地指定这些部分,例如您可以指定文件名。

假设您有两个部分,requestfile,并且文件是InputStreamResource(从来没有文件名),则必须使用{{ 1}}标头。将结果映射用作传出消息有效负载,如下所示:

Content-Disposition

答案 1 :(得分:1)

您无需指定Content-Type标头,也无需配置自定义转换器。

只有payloadMap<String, Object>

才能满足您的需求
else if (content instanceof Map) {
        // We need to check separately for MULTIPART as well as URLENCODED simply because
        // MultiValueMap<Object, Object> is actually valid content for serialization
        if (this.isFormData((Map<Object, ?>) content)) {
            if (this.isMultipart((Map<String, ?>) content)) {
                contentType = MediaType.MULTIPART_FORM_DATA;
            }
            else {
                contentType = MediaType.APPLICATION_FORM_URLENCODED;
            }
        }
}

尽管如此,你必须向StackTrace显示错误,因为我认为有一些响应解析。