Spring SpEL-доступ Конфигурация-Бин - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю в устаревшем программном обеспечении, в котором большая часть конфигурации извлечена из application.properties. Она находится в файле с именем custom.properties, который будет считан в компонент конфигурации, объявленный таким образом.

@Configuration
@ConfigurationProperties(locations = "classpath:custom.properties", ignoreUnknownFields = true, prefix = "custom")
public class CustomProperties {
...
}

Это приложение имеет некоторые запланированные задачи, которые, как было объявлено, работают с фиксированным интервалом и временем. @Scheduled(cron = "0 0 16 * * 3") До сих пор все отлично работает. Недавно меня попросили сделать это cronjob в настраиваемое время. Поэтому я добавил еще одно свойство к custom.properties и атрибут к CustomProperties (включая методы получения и установки). Затем я изменил запланированную аннотацию, чтобы она выглядела следующим образом. @Scheduled(cron = "${@customProperties.cronJob1Schedule}")

Когда я запускаю приложение, я получаю следующее исключение:

java.lang.IllegalStateException: Encountered invalid @Scheduled method 'cronJob1': Could not resolve placeholder '@customProperties.cronJob1Schedule' in string value "${@bwvProperties.cronJob1Schedule}"
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.processScheduled(ScheduledAnnotationBeanPostProcessor.java:406)
    at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.postProcessAfterInitialization(ScheduledAnnotationBeanPostProcessor.java:282)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)

Кто-нибудь имел эту проблему раньше? Почему я не могу получить доступ к компоненту конфигурации в SpEL?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Обратите внимание, что есть два разных механизма, которые работают со строковыми значениями, обрабатываемыми Spring:

Разрешение объекта - ${my.property}

Spring может заменить заполнители ${placeholder} значениями из настроенных источников свойств . Этот процесс просто заменяет строковый ключ строковым значением (и запускает его через конвертер , если необходимо).

Оценка языка весеннего выражения - #{spel.expression}

Spring может запускать содержимое интерпретатора от #{} до SPeL . Это предлагает гораздо более мощный инструмент, поскольку вы можете взаимодействовать с кодом приложения изнутри вашего выражения, например, получая собственность от одного из ваших бобов #{@cumstomProperties.cronJob1Schedule}.

TL; DR

Вам просто нужно переключить ${ на #{ в качестве значения аннотации.

0 голосов
/ 05 сентября 2018

Я полагаю, что вы сделали опечатку, предполагая, что вы вводите свои свойства конфигурации, подобные этой:

@Autowired private CustomProperties bwvProperties

Это должно быть #{bwvProperties.cronJob1Schedule} - отбросить @, изменить $ на #

...