Spring Boot多个@Configuration和SOAP客户端

时间:2015-04-15 14:57:25

标签: spring-boot spring-ws

我尝试过这个简单的教程https://spring.io/guides/gs/consuming-web-service/,但它确实有效。

然后我尝试连接到另一个SOAP服务,其他@Configuration和客户端类扩展WebServiceGatewaySupport。似乎两个客户端类都使用相同的@Configuration - 类,使我首先添加的那个失败(未知的jaxb-context等)。如何确保客户端类使用正确的@Configuration - 类?

2 个答案:

答案 0 :(得分:0)

我最终在@Configuration类中创建了返回WebServiceTemplate的@Bean。也就是说,我不使用Spring的自动配置机制。我删除了extend WebserviceGatewaySupport,并使用@Autowired自动装配WebserviceTemplateBean类中创建的@Configuration bean。

答案 1 :(得分:0)

TL; DR:您必须匹配" marshaller()"的名称客户端配置中带有param变量名的方法。

覆盖bean定义

正在发生的事情是你的@Configuration两个clases都使用相同的bean名称作为Jaxb2Marshaller,即(使用spring示例):

@Bean
public Jaxb2Marshaller marshaller() { //<-- that name
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();     
    marshaller.setContextPath("hello.wsdl");
    return marshaller;
}

&#34; marshaller()&#34;方法名称是将在客户端下面注入的bean名称:

@Bean
public QuoteClient quoteClient(Jaxb2Marshaller marshaller) { //<-- used here
    QuoteClient client = new QuoteClient();
    client.setDefaultUri("http://www.webservicex.com/stockquote.asmx");
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
    return client;
}

如果您使用&#34; marshaller()&#34;对于您的第二个客户端,Spring会覆盖该bean定义。你可以在日志文件中找到这个,找到这样的东西:

INFO 7 --- [main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'marshaller'

解决方案

因此,为了创建更多拥有自己的编组器而不会发生冲突的客户端,您需要具有这样的@Configuration:

@Configuration
public class ClientBConfiguration {

    @Bean
    public Jaxb2Marshaller marshallerClientB() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("hello.wsdl");
        return marshaller;
    }

    @Bean
    public ClientB clientB(Jaxb2Marshaller marshallerClientB) {
        ClientB client = new ClientB();
        client.setDefaultUri("http://www.webservicex.com/stockquote.asmx");
        client.setMarshaller(marshallerClientB);
        client.setUnmarshaller(marshallerClientB);
        return client;
    }

}