26

我对 spring/java 相当陌生,并且一直在为我工作的项目检查 spring-boot。我一直在遵循指南,终于有了一个(半)工作的网络应用程序 MVC + JPA 用于数据访问。当我通过 Jar 方法部署应用程序时,一切正常:

java -jar build/libs/client.jar

但是,我们的应用程序最终会部署到 Tomcat (v7.0.40),所以我需要从项目中创建一个 war 文件。我已经按照 spring.io 网站上的转换 jars 到 war的指南并遇到了问题。它似乎没有加载 application.properties 文件。以下是重要的代码片段:

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

为了完整起见,这里是 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}"
...
...
...

正如我所说,当我通过 jar 运行它时它可以工作,但是当我将它部署到 Tomcat 时它不起作用。我也看了看里面$TOMCAT_HOME/webapps/client/WEB-INF/classes,我看到了application.properties文件。所以我认为它应该在类路径上。我的问题是,为什么tomcat不加载它?我已经尝试过全面搜索,但似乎没有其他人遇到这个问题,所以我不确定它是否只是我配置错误的东西,还是什么。

提前致谢。

4

4 回答 4

25

听从这些人的建议: http: //blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

尝试:

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

然后繁荣酱取胜。

于 2013-12-19T13:33:45.137 回答
11

问题是您尝试@Value在类中使用注释@Configuration。来自@PropertySource的 JavaDoc :

为了使用 PropertySource 中的属性解析 <bean> 定义或 @Value 注释中的 ${...} 占位符,必须注册一个 PropertySourcesPlaceholderConfigurer。这在 XML 中使用 <context:property-placeholder> 时会自动发生,但在使用 @Configuration 类时必须使用静态 @Bean 方法显式注册。

例如,将以下行添加到@Configuration类中:

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

但是,在您的示例中,更合适的方法是将@Configuration注释从GreetingController类(它不包含任何配置)移动到Application类。由于Application该类不包含任何@Value注释,因此它应该在没有建议添加静态PropertySourcesPlaceholderConfigurerbean 的情况下工作。

于 2014-04-13T19:25:47.160 回答
0

我来这里是为了寻找同样的问题。当 Spring Boot 应用程序在 tomcat 中作为战争运行时,application.properties 未加载,但在使用嵌入式 tomcat 运行时它工作正常。问题出在文件名中。我使用了 Application.properties 而不是 application.properties 。从 tomcat 运行时,它看起来是区分大小写的。把它放在这里,如果有人犯了和我一样愚蠢的错误

2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'file:./config/application.xml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件'file:./config/application.yml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件'file:./config/application.properties' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'file:./config/application.yaml' 资源2015-09-10 14:42:13 未找到,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'file:./application.xml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置找不到文件“file:./application.yml”资源 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件“file:./application.properties”资源未找到 2015 -09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件“file:./application.yaml”资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 已跳过配置文件 'classpath:/config/application.xml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 已跳过配置文件'classpath:/config/application.yml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/config/application.properties' 资源未找到2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/config/application.yaml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.xml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath :/application.yml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.properties' 资源未找到 2015-09-10 14 :42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.yaml' 资源未找到找不到资源找不到资源xml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.yml' 资源未找到 2015-09-10 14:42:13,982调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.properties' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件'类路径:/application.yaml' 资源未找到xml' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.yml' 资源未找到 2015-09-10 14:42:13,982调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件 'classpath:/application.properties' 资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件'类路径:/application.yaml' 资源未找到找不到资源 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件“类路径:/application.properties”资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件“classpath:/application.yaml”资源未找到找不到资源 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件“类路径:/application.properties”资源未找到 2015-09-10 14:42:13,982 调试 osbccConfigFileApplicationListener [ContainerBackgroundProcessor[StandardEngine[Catalina]]] 跳过配置文件“classpath:/application.yaml”资源未找到找不到资源找不到资源

于 2015-09-10T22:11:17.593 回答
0

我认为对于那些将默认命名“application.[properties,yaml,etc]”更改为例如“service.[properties,yaml,etc]”的人,可以将其添加到 build.gradle 任务中:

bootRun {
    systemProperties = [
       'spring.config.name':'service'
    ]
}
于 2016-10-26T10:31:19.963 回答