Tomcat不读取Spring-Boot应用程序属性

log*_*nes 26 java spring tomcat spring-boot

我对spring/java相当新,并且已经检查了spring-boot以查找我正在工作的项目.我一直在关注指南,最后有一个(半)工作的网络应用程序MVC + JPA用于数据访问.当我通过Jar方法部署应用程序时,一切正常:

java -jar build/libs/client.jar
Run Code Online (Sandbox Code Playgroud)

但是,我们的应用程序最终将部署到Tomcat(v7.0.40),因此我需要从项目中创建war文件.我在spring.io网站上跟随转换罐到战争指南并遇到了问题.它似乎没有加载application.properties文件.以下是重要的代码片段:

的src/main/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";
    }
} 
Run Code Online (Sandbox Code Playgroud)

的src/main/JAVA /你好/ Application.java

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

的src/main/JAVA /你好/ HelloWebXml.java

public class HelloWebXml extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

SRC /主/资源/ application.properties

app.username=foo
Run Code Online (Sandbox Code Playgroud)

为了完整性,这里是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'
}
Run Code Online (Sandbox Code Playgroud)

我构建应用程序:

gradle clean build
Run Code Online (Sandbox Code Playgroud)

在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}"
...
...
...
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

cod*_*aig 25

按照这个家伙的建议:http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

尝试:

@PropertySources(value = {@PropertySource("classpath:application.properties")})
Run Code Online (Sandbox Code Playgroud)

然后繁荣酱油为胜利.

  • 重复上面的评论:在Spring Boot应用程序中不需要这样做. (5认同)
  • 除了上面的一些评论,这最终对我有用.我的问题仍然是,为什么它首先加载属性?另外,将它添加到我的控制器文件给了我一个编译器警告,我还没有想到. (2认同)
  • @MikeAdler这个答案是指'PropertySources`是复数,而不是'PropertySource`,它是单数的 (2认同)

mat*_*sev 11

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

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

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

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}
Run Code Online (Sandbox Code Playgroud)

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