java - how - Tomcat no lee las propiedades de la aplicación Spring-Boot
spring boot tomcat configuration (4)
Soy bastante nuevo en Spring / Java y he estado revisando spring-boot para un proyecto que tengo en el trabajo. He seguido las guías y finalmente tengo una aplicación web (semi) de trabajo MVC + JPA para el acceso a los datos. Todo funciona cuando despliegue la aplicación mediante el método Jar:
java -jar build/libs/client.jar
Sin embargo, nuestra aplicación eventualmente se implementará en Tomcat (v7.0.40), así que necesito crear un archivo war del proyecto. Seguí los frascos de conversión a la guía de guerra en el sitio spring.io y me encontré con un problema. Parece que no está cargando el archivo application.properties. Aquí están los fragmentos de código importantes:
src / main / 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 / hello / 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
para completar, aquí está el 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''
}
Construyo la aplicación:
gradle clean build
Deja la guerra en tomcat, y luego agota los registros y observa lo siguiente:
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}"
...
...
...
Como dije, funciona cuando lo ejecuto a través de un jar, pero no funciona cuando lo despliegue en Tomcat. También miré dentro de $TOMCAT_HOME/webapps/client/WEB-INF/classes
y veo el archivo application.properties
. Entonces creo que debería estar en el classpath. Mi pregunta es, ¿por qué no está tomcat tomcat? He intentado buscar por todas partes y nadie más parece tener este problema, así que no estoy seguro si es algo que he configurado incorrectamente, o qué.
Gracias por adelantado.
Creo que para aquellos que cambian el nombre predeterminado "application. [Properties, yaml, etc]" a, por ejemplo, "service. [Properties, yaml, etc]", pueden agregar esto en la tarea build.gradle como:
bootRun {
systemProperties = [
''spring.config.name'':''service''
]
}
El problema es que intenta utilizar una anotación @Value
dentro de su clase @Configuration
. Desde JavaDoc de @PropertySource :
Para resolver $ {...} marcadores de posición en <bean> definiciones o @Value anotaciones que usan propiedades de un PropertySource, se debe registrar un PropertySourcesPlaceholderConfigurer. Esto ocurre automáticamente cuando se usa <context: property-placeholder> en XML, pero debe registrarse explícitamente usando un método @Bean estático cuando se usan las clases @Configuration.
por ejemplo, agregue las siguientes líneas a la clase @Configuration
:
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Sin embargo, en su ejemplo, un enfoque más adecuado es mover la anotación @Configuration
de la clase GreetingController
(no contiene ninguna configuración) a la clase Application
. Como la clase Application
no contiene ninguna anotación @Value
, debería funcionar sin la adición sugerida del bean PropertySourcesPlaceholderConfigurer
estático.
Vine aquí buscando el mismo problema. application.properties no se carga cuando la aplicación de arranque de primavera se ejecuta como una guerra dentro de tomcat pero funcionaba bien cuando se ejecutaba con tomcat incorporado. el problema resultó ser el nombre del archivo. Yo había usado Application.properties en lugar de application.properties. cuando se ejecuta desde Tomcat, parece que distingue entre mayúsculas y minúsculas. Poniéndolo aquí para que si alguien comete el mismo error estúpido como lo hice
2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración ''file: ./ config / application.xml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEPURACIÓN osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración ''file: ./ config / application.yml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Archivo de configuración omitido ''file: ./ config / application.properties'' resource not found 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se salta el archivo de configuración ''file: ./ config / application.yaml'' resource no se encontró 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se salta archivo de configuración ''file: ./ application.xml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEBUG osbc cConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Archivo de configuración omitido ''file: ./ application.yml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEPURACIÓN osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Archivo de configuración omitido '' file: ./ application.properties ''resource not found 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración'' file: ./ application.yaml ''recurso no encontrado 2015-09 -10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración ''classpath: /config/application.xml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEPURACIÓN osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración ''classpath: /config/application.yml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEPURACIÓN osbccConfigFileApplicationListener [Containe rBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración ''classpath: /config/application.properties'' resource no encontrado 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omite el archivo de configuración ''classpath : /config/application.yaml ''resource not found 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración'' classpath: /application.xml ''recurso no encontrado 2015-09- 10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Se omitió el archivo de configuración ''classpath: /application.yml'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEPURACIÓN osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina] ]] Saltó archivo de configuración ''classpath: /application.properties'' recurso no encontrado 2015-09-10 14: 42: 13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [ StandardEngine [Catalina]]] Se omitió el archivo de configuración ''classpath: /application.yaml'' recurso no encontrado
sigue este consejo de chicos: http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html
tratar:
@PropertySources(value = {@PropertySource("classpath:application.properties")})
luego salsa de auge para la victoria.