web-dev-qa-db-fra.com

Tomcat ne lit pas les propriétés de l'application Spring-Boot

Je suis assez nouveau chez spring/Java et je cherche Spring-Boot pour un projet que j'ai au travail. J'ai suivi des guides et j'ai enfin une application Web (semi-fonctionnelle) MVC + JPA pour l'accès aux données. Tout fonctionne lorsque je déploie l'application via la méthode Jar: 

Java -jar build/libs/client.jar

Cependant, notre application va éventuellement être déployée sur Tomcat (v7.0.40) et je dois donc créer un fichier war à partir du projet. J'ai suivi le guide converting jars en war sur le site spring.io et j'ai rencontré un problème. Il semble qu’il ne charge pas le fichier application.properties. Voici les extraits de code importants:

src/principal/Java/hello/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/hello/Application.Java

@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

src/main/Java/Bonjour/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

pour être complet, voici le 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'
}

Je construis l'application:

gradle clean build

Abandonnez la guerre dans Tomcat, puis extrayez les journaux et observez les éléments suivants:

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}"
...
...
...

Comme je l'ai dit, cela fonctionne lorsque je l'exécute via un fichier jar, mais ne fonctionne pas lorsque je le déploie sur Tomcat. J'ai aussi regardé à l'intérieur de $Tomcat_HOME/webapps/client/WEB-INF/classes et je vois le fichier application.properties. Donc, je pense que cela devrait être sur le classpath. Ma question est la suivante: pourquoi Tomcat ne le charge-t-il pas? J'ai essayé de chercher partout et personne ne semble avoir ce problème, donc je ne sais pas si c'est juste quelque chose que j'ai mal configuré, ou quoi. 

Merci d'avance.

25
loganasherjones

suivez les conseils de ce type: http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

essayer:

@PropertySources(value = {@PropertySource("classpath:application.properties")})

alors boum sauce pour la victoire.

23
codecraig

Le problème est que vous essayez d'utiliser une annotation @Value dans votre classe @Configuration. Depuis le JavaDoc du @PropertySource :

Afin de résoudre les {{}} espaces réservés dans les définitions <bean> ou les annotations @Value à l'aide des propriétés d'un PropertySource, il est nécessaire d'enregistrer un PropertySourcesPlaceholderConfigurer. Cela se produit automatiquement lors de l'utilisation de <contexte: propriété-espace réservé> dans XML, mais doit être explicitement enregistré à l'aide d'une méthode @Bean statique lors de l'utilisation de classes @Configuration. 

par exemple. ajoutez les lignes suivantes à la classe @Configuration:

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

Cependant, dans votre exemple, une approche plus appropriée consiste à déplacer l'annotation @Configuration de la classe GreetingController (elle ne contient aucune configuration) vers la classe Application. Étant donné que la classe Application ne contient aucune annotation @Value, elle devrait fonctionner sans l'ajout suggéré du bean statique PropertySourcesPlaceholderConfigurer.

11
matsev

Je pense que pour ceux qui changent le nom par défaut "application. [Propriétés, yaml, etc.]" en "service. [Propriétés, yaml, etc]", par exemple, peuvent ajouter ceci à la tâche build.gradle en tant que:

bootRun {
    systemProperties = [
       'spring.config.name':'service'
    ]
}
0
Jake OS

Je suis venu ici à la recherche du même problème. application.properties ne se charge pas lorsque l'application Spring Boot s'exécute comme une guerre à l'intérieur de Tomcat, mais elle fonctionnait correctement sous Tomcat. le problème s'est avéré être dans le nom du fichier. J'avais utilisé Application.properties au lieu de application.properties. lors de l'exécution de Tomcat, il semble qu'il soit sensible à la casse. En le mettant ici pour que si quelqu'un commette la même erreur stupide que celle que j'ai commise

2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ config/application.xml 'ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ config/application.yml 'ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s..c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ config/application.properties 'ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s..c.c..ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ config/application.yaml 'ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ application.xml 'ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ ressource.yml 'ressource non trouvée 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ ressource.properties 'ressource non trouvée 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré: ./ application.yaml 'ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /config/application.xml', ressource non trouvée. 2015-09-10 14: 42: 13,982 DEBUG o.s..c.c..ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /config/application.yml' ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s..c.c..ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /config/application.properties' ressource non trouvée 2015-09-10 14: 42: 13,982 DEBUG o.s..c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /config/application.yaml' ressource non trouvée 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /application.xml' ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /application.yml' ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /application.properties' ressource introuvable 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Fichier de configuration ignoré 'chemin de classe: /application.yaml' ressource non trouvée

0
Jiss Janardhanan