在执行采用多部分参数的休息服务时,没有合适的HttpMessageConverter发现错误

时间:2016-10-13 01:56:16

标签: spring-integration

我在项目中使用Spring Integration。我正在尝试执行一个休息服务,它接受multipart / formdata输入参数。我使用int-http:outbound-gateway来执行rest服务。以下是代码:

<int:channel id="PQcreateAttachment-Rest-Channel" />
    <int:chain input-channel="PQcreateAttachment-Rest-Channel"  output-channel="PQcreateAttachment-StoredProcedure-Router" >

        <int:header-filter  header-names="accept-encoding"/>    

         <int:service-activator  ref="httpOutboundGatewayHandler" method="buildMultipartHttpOutboundGatewayRequest" /> 

        <int-http:outbound-gateway  url-expression="headers.restResourceUrl"
                                    http-method-expression="headers.httpMethod"
                                    extract-request-payload="true"
                                    >
        </int-http:outbound-gateway>

        <int:service-activator ref="msgHandler" method="buildMessageFromExtSysResponse" />

    </int:chain>

但是当我执行上面的代码时,我收到以下错误。

Caused by: org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [org.springframework.integration.message.GenericMessage] and content type [application/x-java-serialized-object]
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:665)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:481)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:460)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:409)
    at org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler.handleRequestMessage(HttpRequestExecutingMessageHandler.java:372)
    ... 121 more

以下是准备我的多部分请求的java代码:

public Message<?> buildMultipartHttpOutboundGatewayRequest(Message<?> inMessage) throws Exception{

        logger.debug(" ************** buildMultipartHttpOutboundGatewayRequest Start *************************");

        String inMsgPayload = (String)inMessage.getPayload();



        SOAXml soaXml = parseSOAXml(inMsgPayload);

        String restURL      = null;
        String contentType  = null;
        String acceptHdr    = null;
        String userId = null;
        String password = null;
        String businessAreaName    = null;
        String typeName   = null;
        String attachmentLocation = null;
        String httpMethod = null;
        Message<?> outMessage = null;
        MessageHeaders inMsgHdrs = null;
        MessageBuilder<?> msgBuild = null;

        String authorization = null;
        //TODO: File location needs to be changed to standard one 
        String fileLocation = "C:\\source.xml";
            //if we reach here means, it is AWD system
            restURL     = getAwdSOAService(soaXml);

        Document document = XmlParserUtil.convertString2Document(inMsgPayload);

         userId = XmlParserUtil.getNodeValue(document,"//userId");
         password = XmlParserUtil.getNodeValue(document,"//PQcreateAttachment/password");
         businessAreaName     = XmlParserUtil.getNodeValue(document,"//businessAreaName");
         typeName = XmlParserUtil.getNodeValue(document,"//typeName");
         httpMethod = XmlParserUtil.getNodeValue(document,"//METHOD");
         attachmentLocation = XmlParserUtil.getNodeValue(document,"//attachmentLocation");

         //Construct source xml 
         //Creating document
           Document sourceDocument = DocumentHelper.createDocument();
         Element sourceInstance = sourceDocument.addElement("createSourceInstance");
         sourceInstance.addAttribute("xmlns", "http://www.dsttechnologies.com/awd/rest/v1");
         Element orderItem=sourceInstance.addElement("businessAreaName");
         orderItem.setText("SAMPLEBA");
         Element orderItemDesc=sourceInstance.addElement("typeName");
         orderItemDesc.setText("SAMPLEST");
        // create source xml file
        XmlParserUtil.createXMLFileUsingDOM4J(sourceDocument, fileLocation);
        authorization = getBasicAuthorization(userId,password);

        Resource source = new ClassPathResource(fileLocation);
        Resource attachment = new ClassPathResource(attachmentLocation);


        Map<String, Object> multipartMap = new HashMap<String, Object>();
        multipartMap.put("source", source);
        multipartMap.put("attachment", attachment);
        logger.info("Created multipart request: " + multipartMap);  


            inMessage = buildMessageForMultipart(multipartMap); 


        //  contentType = csProps.getHttpAwdContentTypeValue();
            acceptHdr   = csProps.getHttpAwdAcceptTypeValue() ;
        //  authorization = getBasicAuthorization(soaXml.getUserid(),decriptPassword(soaXml.getPassword()));

            inMsgHdrs = inMessage.getHeaders();
            msgBuild = MessageBuilder.withPayload(inMessage).copyHeaders(inMsgHdrs);
            msgBuild.removeHeader("Content-Encoding");
            msgBuild.removeHeader("accept-encoding");
            msgBuild.setHeader(csProps.getHttpUrlHdr(), restURL);
            msgBuild.setHeader(csProps.getHttpMethodHdr(), httpMethod);
            msgBuild.setHeader(csProps.getHttpAuthorizatonHdr(),authorization );
//          msgBuild.setHeader(csProps.getHttpContentTypeHdr(), contentType);
//          msgBuild.setHeader(csProps.getHttpAcceptTypeHdr(),acceptHdr);   


        outMessage = msgBuild.build();

        logger.debug(" ************** buildHttpOutboundGatewayRequest End*************************");
        logger.debug(outMessage);
        logger.debug(" ************************************************************************");

        return outMessage;

    }

关于这里有什么问题的任何想法?

1 个答案:

答案 0 :(得分:1)

您的问题是因为您将一条消息包装到另一条消息。

buildMessageForMultipart(multipartMap);的作用是什么?

我确信简单的地图作为有效载荷和那些标题就足够了。

不确定将一条消息包装到另一条消息的重点是什么。