powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Проектирование бинов
5 сообщений из 5, страница 1 из 1
Проектирование бинов
    #40129471
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как лучше создать бины?

Есть конфиг пропертей, которые создается всегда, что требует заполнение NotNull полей
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Configuration
//@ConditionalOnProperty(value = "feign.okhttp.proxy.enabled", havingValue = "true") - вызывает NPE при DI
@ConfigurationProperties(prefix = "feign.okhttp.proxy")
@Validated
@Getter
@Setter
public class FeignProxyProperty {

  @NotNull
  private String host;
  @NotNull
  private int port;
  private String username;
  private String password;
}



Есть конфиг feign
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Slf4j
@Configuration
@EnableFeignClients(basePackages = "")
@RequiredArgsConstructor
public class FeignConfig {

  private final FeignProxyProperty feignProxyProperty;

  @Bean
  @ConditionalOnProperty(value = "feign.okhttp.proxy.enabled", havingValue = "true")
  public Client feignClient() {
....
  }
}




Текущее положение вынуждает меня постоянно описывать настройки в yaml
Код: java
1.
2.
3.
4.
5.
6.
7.
feign:
  okhttp:
    enabled: true
    proxy:
      enabled: ${FEIGN_OKHTTP_PROXY_ENABLED:false}
      host: ${FEIGN_OKHTTP_PROXY_HOST:''}
      port: ${FEIGN_OKHTTP_PROXY_PORT:0}



Я хочу удалить все лишнее из application и чтоб два бина не создавалась, если настройки прокси не указаны
...
Рейтинг: 0 / 0
Проектирование бинов
    #40129580
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,

у вас три куска кода и вопрос никак не связаны между собой, т.е. вы надеетесь что читатель как-то должен догадаться что вам нужно. Тем не менее @Value позволяет определить значения по-умолчанию (@Value({host:''})), чтобы не нужно было писать дичь в application.properties, но с ним есть проблема: там где нужно этот POJO создать руками, оно все равно проходит через bean postprocessor и наполняется значениями из конфига - чтобы этого не происходило нужно интерфейсы выделять.
...
Рейтинг: 0 / 0
Проектирование бинов
    #40129626
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
-=Koba=-,

у вас три куска кода и вопрос никак не связаны между собой, т.е. вы надеетесь что читатель как-то должен догадаться что вам нужно. Тем не менее @Value позволяет определить значения по-умолчанию (@Value({host:''})), чтобы не нужно было писать дичь в application.properties, но с ним есть проблема: там где нужно этот POJO создать руками, оно все равно проходит через bean postprocessor и наполняется значениями из конфига - чтобы этого не происходило нужно интерфейсы выделять.


FeignConfig туда инъектится FeignProxyProperty с настройками прокси, здесь и возникает у меня пробелма

Если указать конфиг (с выключенным прокси) , то созадется FeignProxyProperty и нигде не используется
Код: java
1.
2.
3.
4.
5.
6.
7.
feign:
  okhttp:
    enabled: true
    proxy:
      enabled: ${FEIGN_OKHTTP_PROXY_ENABLED:false}
      host: ${FEIGN_OKHTTP_PROXY_HOST:''}
      port: ${FEIGN_OKHTTP_PROXY_PORT:0}



А если не создавать конфиг feign.okhttp.proxy.enabled и добавить аннтоацию

Код: java
1.
2.
@ConditionalOnProperty(value = "feign.okhttp.proxy.enabled", havingValue = "true")
public class FeignProxyProperty {}



Приложение не стартует

Да можно сделать так, но думал есть более элегантное решение
Код: java
1.
2.
3.
4.
5.
public class FeignConfig {
  @Autowired(required = false)
  private FeignProxyProperty feignProxyProperty;
...
}
...
Рейтинг: 0 / 0
Проектирование бинов
    #40129634
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понял, что он хочет не указывать host/port в конфиге, если proxy.enabled = false, что в данный момент не работает из-за валидации на эти поля

дальше чисто идеи, ибо тонкостей не помню и лень проверять

Код: java
1.
2.
//@ConditionalOnProperty(value = "feign.okhttp.proxy.enabled", havingValue = "true") - вызывает NPE при DI
public class FeignProxyProperty


я бы здесь ожидал ошибки инъекции, т.к. FeignProxyProperty в FeignConfig не опциональная зависимость, а обязательная, как на счет перенести ее туда, где она нужна?

Код: java
1.
2.
3.
4.
5.
 @Bean
  @ConditionalOnProperty(value = "feign.okhttp.proxy.enabled", havingValue = "true")
  public Client feignClient(FeignProxyProperty feignProxyProperty) {

  }



еще можно свой валидатор вместо NotNull написать, который не будет бухтеть, если "feign.okhttp.proxy.enabled" = false - выглядит, возможно, как оверкилл в данном случае, если можно как-то с Conditional разрулить, но концептуально, вероятно, более правильно, ведь по сути так и есть - проперти не могут быть пустыми только если прокси активен иначе пофиг. Городить два варианта бинов только ради прокси тоже как-то не айс, имхо проще в коде разрулить
...
Рейтинг: 0 / 0
Проектирование бинов
    #40130232
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел решение

Код: java
1.
2.
3.
4.
5.
6.
@RequiredArgsConstructor
public class FeignConfig {
  @Nullable 
  private final FeignProxyProperty feignProxyProperty;
...
}




Since Spring 4.3.0.RC1 you can do this:
Код: java
1.
2.
3.
4.
public MyConfiguration(MyServiceA myServiceA, @Autowired(required = false) MyServiceB myServiceB){
  this.myServiceA = myServiceA;
  this.myServiceB = myServiceB;   
}



As of Spring Framework 5.0, you can also use a @Nullable annotation (of any kind in any package — for example, javax.annotation.Nullable from JSR-305):

https://stackoverflow.com/questions/42135102/how-to-set-autowired-constructor-params-as-required-false-individually
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Проектирование бинов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (7): Анонимы (4), Bing Bot 1 мин., Yandex Bot 1 мин., Google Bot 4 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]