1

我想調用一個肥皂服務與春天集成DSL,有一些自定義頭需要添加。Spring-Integration-DSL和Soap服務Soap頭沒有被調用

構建marshellingoutboundgateway。嘗試覆蓋DefaultSoapHeaderMapper,但沒有重寫的方法被調用。

試圖構建這樣的事情。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
     <ObjectType34 > 

     </ObjectType34> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ObjectType12 > 

     </ObjectType12> 
    </soapenv:Body> 
</soapenv:Envelope> 

有一個樣本:https://github.com/spring-projects/spring-integration/blob/master/src/reference/asciidoc/ws.adoc

貌似只有在5.0

發佈詳細信息代碼可用。

任何見解都會有所幫助。

@Configuration 
@SpringBootApplication 
@IntegrationComponentScan 
@EnableIntegration 
public class Application { 
    public static void main(String[] args) { 
     ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args); 
     Info Info = ctx.getBean(Info.class); 

     //Constructing request Payload 
     ObjectType12 getInfoType = new ObjectFactory().ObjectType12(); 
     JAXBElement<GetInfoType> getInfoTypeJAXBElement = new ObjectFactory().createGetInfo(getInfoType); 
     JAXBElement<GetInfoResponseType> getInfoResponseType = Info.getInfo(getInfoTypeJAXBElement); 
     System.out.println(getInfoResponseType.getName()); 
     ctx.close(); 
    } 

    @MessagingGateway 
    public interface Info { 

     @Gateway(requestChannel = "convert.input") 
     JAXBElement<GetInfoResponseType> getInfo(JAXBElement<GetInfoType> InfoType); 

    } 

    @Bean 
    public IntegrationFlow convert() { 

     StringResult result = new StringResult(); 

     return flow -> flow 
       .wireTap(f -> f.<JAXBElement, String>transform(ele -> { 
        jaxb2Marshaller().marshal(ele, result); 
        return result.toString(); 
       }).log()) 
       .handle(endpoint()); 
    } 

    @Bean 
    public Jaxb2Marshaller jaxb2Marshaller() { 
     Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
     marshaller.setPackagesToScan("org.abc", "com.abc"); 
     return marshaller; 
    } 

    @Bean 
    public MarshallingWebServiceOutboundGateway endpoint() { 
     MarshallingWebServiceOutboundGateway gateway = new MarshallingWebServiceOutboundGateway("https://example.com/v1", jaxb2Marshaller(), jaxb2Marshaller()); 

     gateway.setHeaderMapper(new DefaultSoapHeaderMapper() { 

      @Override 
      protected void populateUserDefinedHeader(String headerName, Object headerValue, SoapMessage target) { 
       super.populateUserDefinedHeader("Content-Type", "application/soap+xml", target); 
      } 

      @Override 
      protected void populateStandardHeaders(Map<String, Object> headers, SoapMessage target) { 
       headers.put(WebServiceHeaders.SOAP_ACTION, 
         "http://www.example.com/SOAUI/ServiceHeader/V4"); 
       super.populateStandardHeaders(headers, target); 
      } 

      @Override 
      public void fromHeadersToRequest(MessageHeaders headers, SoapMessage target) { 
       SaajSoapMessage targetMessage = (SaajSoapMessage) target; 
       SoapHeader header = targetMessage.getEnvelope().getHeader(); 
       //Constructing SOAP Header 

       JAXBElement<ObjectType34> trackingHdrTypeJAXBElement = ObjectFactory().createHdr(ObjectType34); 
       jaxb2Marshaller().marshal(trackingHdrTypeJAXBElement, header.getResult()); 
       System.out.println(header.getResult()); 
      } 

      @Override 
      public void setRequestHeaderNames(String... requestHeaderNames) { 
       super.setRequestHeaderNames("*"); 
      } 
     }); 
     gateway.setMessageFactory(new SaajSoapMessageFactory() { 

      @Override 
      public void setSoapVersion(SoapVersion version) { 
       super.setSoapVersion(SoapVersion.SOAP_11); 
      } 
     }); 
     return gateway; 
    } 
} 
+0

您是否介意共享一些調試日誌以確認您的自定義'DefaultSoapHeaderMapper'未被調用?如何在MarshallingWebServiceOutboundGateway中放置一個斷點並調試應用程序以找出發生了什麼?根據你的代碼,沒有什麼可以解決問題的。 –

+0

這是什麼意思?另外,它不能從評論中讀取。只需自己看一下吧!你總是可以有更多的信息和正確的格式 –

+0

嘿阿爾喬姆,按下輸入太快編輯你的問題:這裏是'MarshallingWebServiceOutboundGateway'的檢查上doHandle '有效載荷= {JAXBElement的@ 5161} 頭= {MessageHeaders @ 5162 }大小= 4 0 = 「replyChannel」 - > 1 = 「errorChannel」 - > 2 = 「ID」 - > 「ce84a3c4-e29d-bded-3cdf-e8cd6f90b5a6」 3 = 「時間戳」 - > 「1504575027474」 ' 自定義標頭不是消息的一部分 –

回答

1

UPDATE:修改代碼

@Bean 
    public DefaultSoapHeaderMapper headerMapper11() { 

     return new DefaultSoapHeaderMapper() { 
      @Override 
      public void fromHeadersToRequest(MessageHeaders headers, SoapMessage target) { 
       SaajSoapMessage targetMessage = (SaajSoapMessage) target; 
       SoapHeader header = targetMessage.getEnvelope().getHeader(); 
       //Constructing SOAP Header 
       JAXBElement<ObjectType34> trackingHdrTypeJAXBElement = ObjectFactory().createHdr(ObjectType34); 
       jaxb2Marshaller().marshal(trackingHdrTypeJAXBElement, header.getResult()); 
       super.fromHeadersToRequest(headers, target); 
      } 
     }; 

    } 

以及使用該方法調用設置的標頭:

gateway.setHeaderMapper(headerMapper11()); 

現在重寫的方法獲取調用並且具有頭部爲好。

代碼現在按預期工作。

+0

很高興看到你已經想通了! +1 –