wake-up-neo.com

Tomcat Liest keine Spring-Boot-Anwendungseigenschaften

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.

25
loganasherjones

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.

23
codecraig

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.

11
matsev

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'
    ]
}
0
Jake OS

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

0