Tomcat Не читает Spring -Boot Свойства приложения

Я новичок в spring/java и проверял spring -boot для проекта, который у меня есть на работе. Я следил за руководствами и, наконец, получил (полу) рабочий веб-приложение MVC + JPA для доступа к данным. Все работает, когда я развертываю приложение с помощью метода Jar:

java -jar build/libs/client.jar

Однако наше приложение в конечном итоге будет развернуто в Tomcat (v7.0.40), поэтому мне нужно создать военный файл из проекта. Я следил за преобразованием jars в war на сайт spring.io и столкнулся с проблемой. Похоже, что он не загружает файл application.properties. Вот важные фрагменты кода:

SRC/Основной/Java/Привет/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/Основной/Java/Привет/Application.java

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

SRC/Основной/Java/Привет/HelloWebXml.java

public class HelloWebXml extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

SRC/основные/ресурсы/application.properties

app.username=foo

для полноты, вот 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'
}

Я создаю приложение:

gradle clean build

Отбросьте войну в tomcat, а затем вычеркните журналы и посмотрите следующее:

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

Как я уже сказал, он работает, когда я запускаю его через банку, но не работает, когда я развертываю его в Tomcat. Я также заглянул внутрь $TOMCAT_HOME/webapps/client/WEB-INF/classes, и я вижу файл application.properties. Поэтому я думаю, что это должно быть на пути к классам. Мой вопрос: почему он не загружает его? Я пробовал поиск по всему, и никто другой, похоже, не сталкивался с этой проблемой, поэтому я не уверен, что это то, что я неправильно настроил или что.

Спасибо заранее.

Ответ 2

Проблема заключается в том, что вы пытаетесь использовать аннотацию @Value внутри вашего класса @Configuration. Из JavaDoc @PropertySource:

Чтобы разрешить ${...} заполнители в <bean> определения или аннотации @Value с использованием свойств из PropertySource, необходимо зарегистрировать PropertySourcesPlaceholderConfigurer. Это происходит автоматически при использовании < context: property-placeholder > в XML, но должен быть явно зарегистрирован с использованием статического метода @Bean при использовании классов @Configuration.

например. добавьте следующие строки в класс @Configuration:

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

Однако в вашем примере более подходящий подход заключается в перемещении аннота @Configuration из класса GreetingController (он не содержит никакой конфигурации) в класс Application. Поскольку класс Application не содержит аннотации @Value, он должен работать без предлагаемого добавления статического PropertySourcesPlaceholderConfigurer bean.

Ответ 3

Я пришел сюда для поиска той же проблемы. application.properties не загружается, когда приложение загрузки spring запускается как война внутри tomcat, но при работе со встроенным tomcat он отлично работает. проблема оказалась в имени файла. Я использовал Application.properties вместо application.properties. при работе с tomcat это похоже на чувствительность к регистру. Поместите его сюда, чтобы, если кто-то совершил ту же самую глупую ошибку, что и я.

2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Ресурс пропущенного файла конфигурации:./config/application.xml не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Ресурс пропущенного файла конфигурации:./config/application.yml не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Ресурс пропущенного файла конфигурационного файла:./config/application.properties не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Файл файла файла пропущенного файла:./config/application.yaml не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Ресурс пропущенного файла конфигурации "файл:./application.xml" не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Файл пропущенного файла конфигурации:./application.yml не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Ресурс пропущенного конфигурационного файла:./application.properties не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Файл пропущенного файла конфигурации:./application.yaml не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл "classpath:/config/application.xml" ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл 'classpath:/config/application.yml' ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл "classpath:/config/application.properties" ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл 'classpath:/config/application.yaml' ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл "classpath:/application.xml" ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл 'classpath:/application.yml' ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл 'classpath:/application.properties' ресурс не найден 2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Пропущенный конфигурационный файл 'classpath:/application.yaml' ресурс не найден

Ответ 4

Я думаю, что для тех, кто меняет имя по умолчанию "application. [properties, yaml, etc]", например, "service. [properties, yaml и т.д.]", может добавить это в задачу build.gradle как:

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