Как ссылаться на фасоль, который является записью из пружинного выражения?JAVA

Программисты JAVA общаются здесь
Anonymous
Как ссылаться на фасоль, который является записью из пружинного выражения?

Сообщение Anonymous »

У меня есть Spring Boot автоматически чтение в некотором приложении. YAML Конфигурация в эту запись:

Код: Выделить всё

package foo.bar.baz;

@ConfigurationProperties(prefix = "apns")
public record ApnsConfiguration(
Duration gracefulShutdownTimeout,
int maxAttempts,
Duration minDelay,
Duration maxDelay,
List endpoints
Этот объект читается совершенно хорошо, и он используется без проблем в ряде мест. Когда я указываю литералы для maxatmempt и для аргументов @backoff он работает нормально. Но я хочу получить эти значения от бобов (множитель является постоянной, поскольку мы не заинтересованы в изменении их в конфигурации). < /P>
Я пробовал: < /p>

Код: Выделить всё

    @Retryable(
retryFor = RetryableException.class,
maxAttemptsExpression = "#{@apnsConfiguration.maxAttempts}",
backoff = @Backoff(
delayExpression =
"#{apnsConfiguration.minDelay.toMillis}",
maxDelayExpression =
"#{@apnsConfiguration.maxDelay.toMillis}",
multiplier = BACKOFF_MULTIPLIER)
)
< /code>
Однако, когда это тестирует (и запуск) сбое с этими ошибками: < /p>
EL1058E: A problem occurred when trying to resolve bean 'apnsConfiguration': 'Could not resolve bean reference against BeanFactory'
org.springframework.expression.spel.SpelEvaluationException: EL1058E: A problem occurred when trying to resolve bean 'apnsConfiguration': 'Could not resolve bean reference against BeanFactory'
[snip]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'apnsConfiguration' available
at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:925)
< /code>
Я не понял, почему он не нашел бобов, поэтому я распечатал имена всех бобов, используя это: < /p>
    @EventListener
public void handleContextRefreshed(final ContextRefreshedEvent event) {
Arrays.stream(event.getApplicationContext().getBeanDefinitionNames())
.forEach(name -> log.info("Bean name: {}", name));
}
< /code>
Когда я смотрю на этот вывод, я вижу это: < /p>
Bean name: baz-foo.bar.baz.ApnsConfiguration
< /code>
Итак, я затем изменил весенние выражения, чтобы быть такими, как: < /p>
maxAttemptsExpression = "#{@baz-foo.bar.baz.ApnsConfiguration.maxAttempts}"
Но что также не смог найти бобов, жаловался, что не может найти бобы с именем Baz .
В этой распечатку бобов я вижу другие бобы, которые я создал с совершенно нормальными именами. Например, у меня есть < /p>

Код: Выделить всё

@Component
public final class ApnsMessageConverter implements Converter
и это отображается в списке имен в качестве apnsmessageconverter , как и ожидалось. Я хотя о том, чтобы дать ему явное имя, разместив что -то вроде @Configuration в APNSConfiguration запись, поскольку @Configuration позволяет указать имя, но это не допустимое аннотация. И если нет, есть ли у Springel какой-то синтаксис, который будет принимать Baz-foo.bar.baz.apnsconfiguration как имя боба, а не думать, что Baz является названием боба (и я думаю, что остальная часть строки является частью какого-то выражения)? пробная и ошибка я обнаружил, что это работает: < /p>

Код: Выделить всё

maxAttemptsExpression = "#{(@'baz-foo.bar.baz..ApnsConfiguration').maxAttempts}"
Итак, по крайней мере, у меня есть A решение.>

Подробнее здесь: https://stackoverflow.com/questions/795 ... expression

Вернуться в «JAVA»