用@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
对象,例如
- 对于
target=1
,客户端必须配置为使用 setDefaultUri("http://uri-1")
- 对于
target=2
,客户端必须配置为使用 setDefaultUri("http://uri-2")
我不太理解该怎么做。
关于您的第一个问题:
// 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.
我的 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
对象,例如
- 对于
target=1
,客户端必须配置为使用setDefaultUri("http://uri-1")
- 对于
target=2
,客户端必须配置为使用setDefaultUri("http://uri-2")
我不太理解该怎么做。
关于您的第一个问题:
// 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.