#spring #spring-boot #soap-client
#spring #spring-загрузка #soap-клиент
Вопрос:
Мое приложение Spring Boot реализует 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
мне нужно настроить этот MyClient
объект с другим URI, например
- для
target=1
клиента необходимо настроить использованиеsetDefaultUri("http://uri-1")
- для
target=2
клиента необходимо настроить использованиеsetDefaultUri("http://uri-2")
У меня некоторые проблемы с пониманием того, как это сделать.
Ответ №1:
Что касается вашего первого вопроса:
// этот пакет должен соответствовать пакету, указанному в pom.xml marshaller.setContextPath(«de.mypackage»);
Вы можете использовать плагин maven resources для жесткого кодирования свойств maven в файлах properties или yaml, используя @property.name@
синтаксис. Первым шагом является добавление настраиваемого свойства и ссылка на свойство в разделе плагина:
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
public Jaxb2Marshaller marshaller(@Value("${pluginName.generatePackage}") String generatePackage) {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath(generatePackage);
return marshaller;
}
Если вы используете родительский элемент Spring Boot starter, вам не нужна дополнительная настройка для использования вышеуказанной настройки. В противном случае вам может потребоваться добавить немного конфигурации ресурсов, описанной здесь .
Что касается вашего второго вопроса:
В зависимости от другого целевого свойства мне нужно настроить этот объект MyClient с другим URI, например
Как только вы получите pom.xml недвижимость есть много вариантов. Если конфигурация не такая сложная, компонент может быть создан с использованием аналогичной инъекции строк и некоторой пользовательской логики в определении компонента или с использованием аннотаций 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
}
Если определение компонента немного сложнее, рассмотрите возможность настройки FactoryBean .