【问题标题】:Spring-Integration-DSL & Soap Service Soap header is not getting invokedSpring-Integration-DSL & Soap Service Soap 标头未被调用
【发布时间】:2017-09-05 00:40:10
【问题描述】:

我正在尝试使用 spring 集成 DSL 调用一个肥皂服务,有一些需要添加的自定义标头。

构建了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;
    }
}

【问题讨论】:

  • 您介意分享一些调试日志以确认您的自定义DefaultSoapHeaderMapper 未被调用吗?如何在MarshallingWebServiceOutboundGateway 中放置一个断点并调试应用程序以了解发生了什么?根据您的代码,没有什么可以解决问题的。
  • 什么意思?另外,从评论中无法读取。自己去看看吧!您始终可以使用更多信息和正确格式来编辑您的问题
  • 嘿,Artem,按回车太快了 : ,这是对 MarshallingWebServiceOutboundGateway payload = {JAXBElement@5161} headers = {MessageHeaders@5162} size = 4 0 = "replyChannel" -&gt; 1 = "errorChannel" -&gt; 2 = "id" -&gt; "ce84a3c4-e29d-bded-3cdf-e8cd6f90b5a6" 3 = "timestamp" -&gt; "1504575027474" 中的 doHandle 的检查,自定义标头不是消息的一部分
  • 在IDE中调试不帮助逐行查看问题吗?
  • 可能是我无法在第一篇文章中阐明这个问题。 gateway.setHeaderMapper(new DefaultSoapHeaderMapper() { }) ,没有一个被覆盖的方法是 .被叫

标签: spring web-services spring-integration spring-integration-dsl


【解决方案1】:

更新:修改代码

@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());

现在被覆盖的方法被调用并且也有标题。

代码现在按预期工作。

【讨论】:

  • 很高兴看到您发现了这一点! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
相关资源
最近更新 更多