Динамическая конфигурация SOAP-клиента, анотированного с помощью @Bean

#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 .