Wie kann man die Bohne verweisen, die ein Aufzeichnung aus einem Frühlingsausdruck ist?Java

Java-Forum
Anonymous
 Wie kann man die Bohne verweisen, die ein Aufzeichnung aus einem Frühlingsausdruck ist?

Post by Anonymous »

Ich habe Spring Start automatisch in einer Anwendung. Yaml Konfiguration in diesen Datensatz:

Code: Select all

package foo.bar.baz;

@ConfigurationProperties(prefix = "apns")
public record ApnsConfiguration(
Duration gracefulShutdownTimeout,
int maxAttempts,
Duration minDelay,
Duration maxDelay,
List endpoints
Dieses Objekt wird perfekt in Ordnung gelesen und an einer Reihe von Stellen ohne Probleme verwendet. Wenn ich Literale für Maxattempt und für die Argumente an @backoff gut angeben, funktioniert es einwandfrei. Aber ich möchte diese Werte aus der Bean erhalten (der Multiplikator ist eine Konstante, da wir nicht daran interessiert sind, sie in der Konfiguration zu variieren). < /P>
Ich habe es versucht: < /p>

Code: Select all

    @Retryable(
retryFor = RetryableException.class,
maxAttemptsExpression = "#{@apnsConfiguration.maxAttempts}",
backoff = @Backoff(
delayExpression =
"#{apnsConfiguration.minDelay.toMillis}",
maxDelayExpression =
"#{@apnsConfiguration.maxDelay.toMillis}",
multiplier = BACKOFF_MULTIPLIER)
)
< /code>
, wenn diese Tests (und Startups) bei diesen Fehlern fehlschlagen: < /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>
Ich habe nicht verstanden, warum sie die Bean nicht gefunden habe, also habe ich die Namen aller Bohnen verwendet: < /p>
    @EventListener
public void handleContextRefreshed(final ContextRefreshedEvent event) {
Arrays.stream(event.getApplicationContext().getBeanDefinitionNames())
.forEach(name -> log.info("Bean name: {}", name));
}
< /code>
Wenn ich mir diese Ausgabe ansehe, sehe ich Folgendes: < /p>
Bean name: baz-foo.bar.baz.ApnsConfiguration
< /code>
Also habe ich als nächstes die Frühlingsausdrücke so geändert, wie es: < /p>
sindmaxAttemptsExpression = "#{@baz-foo.bar.baz.ApnsConfiguration.maxAttempts}"
Aber dass auch die Bean nicht gefunden hat und sich beschwerte, dass sie keine Bean namens Baz . Zum Beispiel habe ich eine < /p>

Code: Select all

@Component
public final class ApnsMessageConverter implements Converter
Und das wird in der Liste der Namen als APNSMessageConverter wie erwartet angezeigt. Wenn Sie ihm einen expliziten Namen geben, indem Sie so etwas wie @Configuration in den APNSConfiguration -Datensatz aufnehmen, da @Configuration Sie einen Namen angeben können, aber es ist keine zulässige Annotation dort. Und wenn nicht, hat Springel eine Syntax, die baz-foo.bar.baz.apnsconfiguration als Name der Bean nimmt, anstatt zu denken, dass Baz der Name der Bean ist (und ich denke, der Rest des String ist Teil eines Ausdrucks)? Versuch und Irrtum habe ich festgestellt, dass dies funktioniert: < /p>

Code: Select all

maxAttemptsExpression = "#{(@'baz-foo.bar.baz..ApnsConfiguration').maxAttempts}"
Also habe ich zumindest a Lösung.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post