2017-02-09 75 views
0

我构建了一个简单的Spring集成应用程序,它从目录中读取CSV文件,将它们转换为XML文档并通过REST XML Web服务将它们发送到系统。与Spring集成使用HttpOutboundGateway时发生HTTP 415错误

集成信息流看起来是这样的:

<int-file:inbound-channel-adapter channel="filesChannel" ... /> 

<int:channel id="filesChannel" /> 
<int:publish-subscribe-channel id="resultChannel" /> 

<int:chain input-channel="filesChannel" output-channel="resultChannel"> 
    <!-- Parse the CSV into individual messages of Map<String,String> type --> 
    <int:transformer ref="csvToMapsTransformer" method="transform" /> 
    <int:splitter /> 

    <!-- Transform the map into a simple XML --> 
    <int:transformer ref="mapToXmlTransformer" method="transform" /> 

    <!-- Use XSLT template to transform the simple XML into the API format --> 
    <int-xml:xslt-transformer xsl-resource="order-api-transform.xslt" /> 

    <int:header-enricher> 
     <int:header name="Content-Type" value="text/xml" /> 
    </int:header-enricher> 

    <!-- Post the XML to the target system --> 
    <int-http:outbound-gateway 
     http-method="POST" 
     url="http://example.com/method" 
     expected-response-type="javax.xml.transform.Source" 
     /> 
</int:chain> 

mapToXmlTransformer是在它建立与一个StringBuilder一个XML字符串映射项的简单循环。然后将这个XML字符串用XSLT转换为目标系统预期的格式。

流程的工作原理与我期待的非常相似。它发送一个POST请求到目标系统的有效载荷,但它返回一个HTTP 415回应:

Caused by: org.springframework.web.client.HttpClientErrorException: 415 Cannot consume content type 

好像我做一个简单的愚蠢的错误与我的流量,但我相信新的Spring集成和自己找不到它。

请帮

+1

目标系统所期望的'应用程序/ xml'取代'文/ xml'并非常严格的这一点。 Info:'application/xml'也是有效的,并且定义了对人类来说不可读(模糊的定义)的媒体类型。 – meistermeier

+0

嗨@meistermeier。你是对的,应用程序确实期望'application/xml',但这不是唯一的问题。你和Gary的建议相结合帮助了我! – artemb

回答

1

弹簧消息内容类型邮件头是contentType,不Content-Type

请参阅MessageHeaders.CONTENT_TYPE - 它被映射到Http Content-Type标题。

您可以通过规划环境地政司使用常量:

<header name="#{T(org.springframework.messaging.MessageHeaders).CONTENT_TYPE}" 
     value="text/xml" /> 

或只使用name="contentType"

+0

谢谢你,工作。而且,@meistermeier也是对的。所以当我应用“contentType”名称和“application/xml”值时 - 所有的工作!谢谢 – artemb