用@Bean 注释的 SOAP 客户端的动态配置

Dynamic configuration of a SOAP client anotated with @Bean

我的 Spring 引导应用程序实现了如下所述的 SOAP 客户端:

@Configuration
public class MyClientConfiguration {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        // this package must match the package in the <generatePackage> specified in pom.xml
        marshaller.setContextPath("de.mypackage");
        return marshaller;
    }

    @Bean
    public MyClient myclient(Jaxb2Marshaller marshaller) {
        MyClient client = new MyClient();
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }
}

取决于另一个 属性 target 我需要使用不同的 URI 配置此 MyClient 对象,例如

我不太理解该怎么做。

关于您的第一个问题:

// this package must match the package in the specified in pom.xml marshaller.setContextPath("de.mypackage");

您可以使用 maven 资源插件使用 @property.name@ 语法将 maven 属性硬编码到属性或 yaml 文件中。第一步是添加一个自定义的属性,参考插件部分的属性:

pom.xml

<properties>
  <pluginName.generatePackage>de.mypackage</pluginName.generatePackage>
</properties>

...

<plugin>
  <groupId>org.plugin</groupId>
  <artifactId>pluginName</artifactId>
  ...
  <configuration>
    <schemaDirectory>${pluginName.generatePackage}</schemaDirectory>
  </configuration>
</plugin>

然后,在application.properties(或yaml文件)中定义一个新的属性并引用maven 属性:

application.properties

pluginName.generatePackage=@pluginName.generatePackage@

application.yaml

pluginName:
  generatePackage: '@pluginName.generatePackage@'

最后,将 属性 注入到您的 bean 配置中:

    @Bean
    public Jaxb2Marshaller marshaller(@Value("${pluginName.generatePackage}") String generatePackage) {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath(generatePackage);
        return marshaller;
    }

如果您使用的是 Spring Boot starter parent,则不需要额外配置即可使用上述设置。否则,您可能需要添加一些 here.

中描述的资源配置

关于你的第二个问题:

Depending on another property target I need to configure this MyClient object with a different URI, e.g.

获得 pom.xml 属性 后,有很多选择。如果配置不是那么复杂,可以使用类似的字符串注入和 bean 定义中的一些自定义逻辑来创建 bean,或者使用 conditionalOn* 注释,例如:

@Bean
@ConditionalOnProperty(name = "target", havingValue="1")
public MyClient myclient(Jaxb2Marshaller marshaller) {
  // .. bean 1 definition
}

@Bean
@ConditionalOnProperty(name = "target", havingValue="2")
public MyClient myclient(Jaxb2Marshaller marshaller) {
  // .. bean 2 definition
}

如果bean定义稍微复杂一点,可以考虑设置一个FactoryBean.