Ich bin ziemlich neu in Spring/Java und habe Spring-Boot für ein Projekt, das ich bei der Arbeit habe, durchgecheckt. Ich habe Handbücher befolgt und habe schließlich eine (halb) funktionierende Web-App MVC + JPA für den Datenzugriff. Alles funktioniert, wenn ich die App über die Jar-Methode bereitstelle:
Java -jar build/libs/client.jar
Letztendlich wird unsere Anwendung jedoch auf Tomcat (Version 7.0.40) bereitgestellt. Daher muss ich eine Kriegsdatei aus dem Projekt erstellen. Ich habe die Converting-Gläser zu War 's Guide auf der Website spring.io befolgt und bin auf ein Problem gestoßen. Es scheint, dass die Datei application.properties nicht geladen wird. Hier sind die wichtigen Codeausschnitte:
src/main/Java/hallo/GreetingController:
@Controller
@Configuration
public class GreetingController {
@Value("${app.username}")
private String username;
@RequestMapping("/greeting")
public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
model.addAttribute("username", username);
return "greeting";
}
}
src/main/Java/hallo/Anwendung.Java
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
src/main/Java/hallo/HelloWebXml.Java
public class HelloWebXml extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
src/main/resources/application.properties
app.username=foo
der Vollständigkeit halber hier das build.gradle:
buildscript {
repositories {
maven { url "http://repo.spring.io/libs-snapshot" }
mavenLocal()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:0.5.0.M6")
}
}
apply plugin: 'Java'
apply plugin: 'Eclipse-wtp'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'war'
war {
baseName = 'client'
version = '0.1.0'
}
repositories {
mavenCentral()
maven { url "http://repo.spring.io/libs-snapshot" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:0.5.0.M6")
compile("org.thymeleaf:thymeleaf-spring3:2.0.16")
testCompile("junit:junit:4.11")
}
task wrapper(type: Wrapper) {
gradleVersion = '1.8'
}
Ich baue die Anwendung:
gradle clean build
Lass den Krieg in Tomcat fallen, untersuche dann die Protokolle und folge den folgenden Informationen:
SEVERE: ContainerBase.addChild: start:
org.Apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]
.StandardHost[localhost].StandardContext[/client]]
...
...
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating the bean
with name 'greetingController': Injection of autowired dependencies failed; nested exception
is Java.lang.IllegalArgumentException: Could not resolve placeholder 'app.username' in string
value "${app.username}"
...
...
...
Wie gesagt, es funktioniert, wenn ich es über ein Jar laufen lasse, aber nicht, wenn ich es auf Tomcat bereitstelle. Ich habe auch in $Tomcat_HOME/webapps/client/WEB-INF/classes
nachgesehen und sehe die application.properties
-Datei. Ich denke also, dass es auf dem Klassenpfad liegen sollte. Meine Frage ist, warum lädt Tomcat es nicht? Ich habe versucht, alles zu durchsuchen, und niemand sonst scheint dieses Problem zu haben. Ich bin mir nicht sicher, ob es etwas ist, das ich falsch konfiguriert habe oder was.
Danke im Voraus.
befolgen Sie die Ratschläge dieser Jungs: http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html
versuchen:
@PropertySources(value = {@PropertySource("classpath:application.properties")})
dann Boomsoße für den Sieg.
Das Problem ist, dass Sie versuchen, eine @Value
-Anmerkung in Ihrer @Configuration
-Klasse zu verwenden. Aus dem JavaDoc der @PropertySource :
Um $ {...} Platzhalter in <bean> -Definitionen oder @Value-Annotationen mit Eigenschaften aus einer PropertySource auflösen zu können, muss ein PropertySourcesPlaceholderConfigurer registriert werden. Dies geschieht automatisch bei der Verwendung von <context: property-placeholder> in XML, muss jedoch bei Verwendung von @Configuration-Klassen explizit mit einer statischen @Bean-Methode registriert werden.
z.B. Fügen Sie der Klasse @Configuration
die folgenden Zeilen hinzu:
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
In Ihrem Beispiel empfiehlt es sich jedoch, die Annotation @Configuration
von der Klasse GreetingController
(die keine Konfiguration enthält) in die Klasse Application
zu verschieben. Da die Klasse Application
keine @Value
-Annotation enthält, sollte sie ohne die vorgeschlagene Hinzufügung der statischen PropertySourcesPlaceholderConfigurer
-Bean funktionieren.
Ich denke, für diejenigen, die die Standardbenennung "application. [Properties, yaml, etc]" ändern, um beispielsweise "service. [Properties, yaml etc]" zu ändern, kann dies der Aufgabe build.gradle folgendermaßen hinzugefügt werden:
bootRun {
systemProperties = [
'spring.config.name':'service'
]
}
Ich kam hierher und suchte nach dem gleichen Thema. application.properties wird nicht geladen, wenn die Springboot-Anwendung innerhalb von Tomcat als Krieg ausgeführt wird, aber es lief einwandfrei, wenn sie mit eingebettetem Tomcat ausgeführt wurde. Es stellte sich heraus, dass das Problem im Dateinamen war. Ich hatte Application.properties anstelle von application.properties verwendet. Wenn Sie von Tomcat aus arbeiten, scheint die Groß- und Kleinschreibung zu beachten. Setzen Sie es hier, damit, wenn jemand den gleichen dummen Fehler begeht wie ich
2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ config/application.xml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ config/application.yml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ config/application.properties' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ config/application.yaml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ application.xml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ application.yml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ application.properties' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'file: ./ application.yaml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /config/application.xml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /config/application.yml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /config/application.properties' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /config/application.yaml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /application.xml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /application.yml' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'Klassenpfad: /application.properties' Ressource nicht gefunden 2015-09-10 14: 42: 13.982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Übersprungene Konfigurationsdatei 'classpath: /application.yaml' wurde nicht gefunden