webentwicklung-frage-antwort-db.com.de

Spring Boot konnte Platzhalter in Zeichenfolge nicht auflösen

Ich verwende Spring-Boot auf einem eingebetteten Tomcat-Server durch maven mit mvn clean install spring-boot:run. Bei jedem Start erhalte ich jedoch folgende Fehlermeldung:

Ursache: Java.lang.IllegalArgumentException: Platzhalter 'language' konnte nicht im Zeichenfolgenwert "$ {language}" .__ aufgelöst werden. at org.springframework.util.PropertyPlaceholderHelper.parseStringValue (PropertyPlaceholderHelper.Java:174) ~ [Spring-Core-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders (PropertyPlaceholderHelper.Java:126) ~ [Spring-Core-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders (AbstractPropertyResolver.Java:236) ~ [spring-core-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders (AbstractPropertyResolver.Java:210) ~ [Spring-Core-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.context.support.PropertySourcesPlaceholderConfigurer $ 2.resolveStringValue (PropertySourcesPlaceholderConfigurer.Java:172) ~ [spring-context-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue (AbstractBeanFactory.Java:831) ~ [spring-beans-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory.Java:1086) ~ [spring-beans-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (DefaultListableBeanFactory.Java:1066) ~ [spring-beans-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor.Java:585) ~ [spring-beans-4.3.6.RELEASE.jar: 4.3.6.RELEASE.jar: 4.3.6.RELEASE.jar:]. at org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.Java:88) ~ [spring-beans-4.3.6.RELEASE.jar: 4.3.6.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.Java:366) ~ [spring-beans-4.3.6.RELEASE.jar: 4.3.6.RELEASE.jar: 4.3.6.RELEASE.jar.]. ... 35 gemeinsame Frames weggelassen

Dieser Fehler bezieht sich auf diese beiden Codezeilen: 

@Value("${language}")
private String language;

Dieses Sprachflag wird in meinen application.properties wie folgt angegeben: 

application.properties

language=Java
logging.level.org.springframework=TRACE

Dies ist der verwirrende Teil: Wenn ich den Build ohne den spring-boot: run -Befehl starte, wird er ordnungsgemäß erstellt, und ich kann den eingebauten jar ohne Probleme ausführen. Nur wenn ich versuche, auf dem eingebetteten Tomcat-Server zu laufen, stoße ich auf dieses Problem. 

Ich kann das irgendwie umgehen, indem ich das in meinem Code mache: 

@Value("${language:Java}")
private String language;

Aber das macht für mich keinen Sinn, da Spring den Defaultwert automatisch aus der application.properties-Datei lesen soll. 

EDIT: Wie bereits erwähnt, liest application.properties überhaupt nicht, wenn es auf dem eingebetteten Tomcat-Server ausgeführt wird. Gibt es eine Möglichkeit, die Datei zum Lesen zu zwingen oder einen Grund, warum sie nicht gelesen werden kann? Es funktioniert gut, wenn es auf einem externen App-Server anstelle des eingebetteten bereitgestellt wird. 

Vielen Dank im Voraus für Ihre Hilfe. 

2
aBrokenSniper

Fixiert durch Hinzufügen dieser Zeilen zum Pom im Abschnitt <resources>

<resource>
     <directory>src/main/resources</directory>
     <filtering>true</filtering>
     <includes>
          <include>**/*.properties</include>
     </includes>
</resource>

Was ich nicht ganz verstehe, ist die Notwendigkeit, dies zu tun. 

a) Ich kann dies auf einem externen App-Server ausführen, ohne diese Zeile hinzufügen zu müssen, und die App liest application.properties einfach. 

b) Ich kann die App als eigenständige Java-Anwendung in Eclipse ausführen (d. h. ohne die App über maven erstellen zu müssen), und application.properties wird gelesen

c) soll Spring-boot das nicht standardmäßig lesen? (Wie aus den beiden obigen Fällen hervorgeht?)

Vielen Dank an alle für ihre Hilfe. hoffentlich hilft das anderen. 

8
aBrokenSniper

Warst du das zufällig von Eclipse?

Ich hatte das gleiche Problem und bemerkte, dass das Projekt nicht die Maven-Natur hatte. Klicken Sie mit der rechten Maustaste auf das Projekt -> Konfigurieren -> In Maven-Projekt konvertieren. Klicken Sie dann mit der rechten Maustaste auf das Projekt -> Maven-> Update. Das Problem wurde behoben.

0
Paul Croarkin