No suitable HttpMessageConverter found error while executing rest service that takes multipart parameters

亡梦爱人 提交于 2020-01-05 05:48:08

问题


I am using Spring Integration in my project. I am trying to execute a rest service which takes multipart/formdata input parameters. I am using int-http:outbound-gateway to execute rest service. The following is the code:

<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>

But I am getting the following error when I execute the above code.

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

Here is the java code that prepares my multipart request:

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;

    }

Any ideas on what's wrong here?


回答1:


Your problem is because you wrap one message to another.

What your buildMessageForMultipart(multipartMap); does?

I'm sure the simple map as payload and those header would be enough.

Not sure what is the point to wrap one message to another.



来源:https://stackoverflow.com/questions/40011050/no-suitable-httpmessageconverter-found-error-while-executing-rest-service-that-t

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!