Как внедрить appllication, значение свойства на основе доступности поля? - PullRequest
3 голосов
/ 09 января 2020

Я работаю над приложением весенней загрузки. В этом приложении я создал application.properties в виде пружинного компонента, используя следующий код

SCENARIO 1

Application.Properties

http.port =8080

ApplicationPropertyHandler

@PropertySource("config/application.properties")
@Component
public class ApplicationPropertyHandler
{
    @Value("${http.port}")
    private String nonSecurePort;

    @Value("${https.port}" required=false)
    private String securePort;

    @Value("${server.servlet.context-path}")
    private String contextPath;

    @Value("${security.key}")
    private String securityKey;


}

СЦЕНАРИЙ 2

Когда я защищаю приложение https .port запишет в application.properties

Application.Properties

http.port =8080
https.port=8081

ApplicationPropertyHandler

@PropertySource("config/application.properties")
@Component
public class ApplicationPropertyHandler
{
    @Value("${http.port}")
    private String nonSecurePort;

    @Value("${https.port}" required=false)
    private String securePort;

    @Value("${server.servlet.context-path}")
    private String contextPath;

    @Value("${security.key}")
    private String securityKey;

Сценарий 1: я получил следующее исключение

org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем ApplicationPropertyHandler ': сбой внедрения зависимостей с автопроводкой; вложенное исключение: java .lang.IllegalArgumentException: не удалось разрешить заполнитель 'https.port' в значении "$ {https.port}"

Возможно ли запустить сценарий 1 без поля https.port в application.properties?

Ответы [ 5 ]

3 голосов
/ 09 января 2020

Я думаю, что реальный вопрос в том, что вы делаете с этим ApplicationPropertyHandler?

Одно из возможных решений - вообще не использовать значения, оно не было представлено среди ответов, поэтому я добавляю его сюда.

Итак, из вашего вопроса:

  • у вас есть весенняя загрузка
  • вы поддерживаете файл application.properties с конфигурацией

Но тогда вы делаете все сопоставление самостоятельно (отображение каждого свойства в значение).

Вместо использования @Value (который действительно имеет значение по умолчанию, которое вы можете указать после двоеточия ":", как заявили многие наши коллеги), рассмотрите возможность использования встроенная функция весенней загрузки:


@SpringBootAppplication
@EnableConfigurationProperties(MyConfigurationProperties.class)
public class Main {
   public static void main(String [] args){...}
}

@ConfigurationProperties 
public class MyConfigurationProperties {


   public static class Http {
       private int port = 8080; // getters/setters, 0 is a default
   }

   public static class Https {
       private int port = 0; // getters/setters, 0 is a default
   }

   ....
}

Это позволяет:

  • отладку (вы можете установить точку останова и посмотреть, что на самом деле приходит к свойству)
  • автозаполнение при редактировании файла application.properties в IDE (если вы добавляете специальную зависимость в maven / gradle)
  • с легким указанием значений по умолчанию (без SPEL)
  • расслабленное связывание
2 голосов
/ 09 января 2020

Вы можете использовать нулевое значение по умолчанию @value, как упомянуто:

@Value("${https.port:#{null}}")
private String securePort;

При условии, что null securePort вводится в случае его отсутствия.

1 голос
/ 09 января 2020

Вы можете проверить: Метод с аннотацией Spring @Value, использовать значение по умолчанию, когда свойства недоступны

Или попробовать одно из следующих действий:

1) @Value("${https.port:#{null}}")

2) @Value("${https.port:value-by-default-if-property-not-exist}")

Сначала будет введите null вместо String, второе «значение по умолчанию, если свойство не существует».

PS Должно работать, если файл «application.properties» находится в папке / resources / config.

0 голосов
/ 09 января 2020

Вы можете использовать приведенный ниже код - который свяжет переменную securePort с пустой строкой, если свойство не найдено, а если свойство найдено, то будет использовано настроенное значение. В обоих случаях запуск приложения не будет затронут

@Value("${https.port:}")
private String securePort;
0 голосов
/ 09 января 2020
@Component
@PropertySource("config/application.properties")
@ConditionalOnProperty("https.port")
public class ApplicationPropertyHandler {

    @Value("${http.port}")
    private String nonSecurePort;

    @Value("${https.port}")
    private String securePort;

    @Value("${security.key}")
    private String securityKey;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...