web-dev-qa-db-ja.com

TomcatがSpring-Bootアプリケーションプロパティを読み取っていない

私はspring/Javaが初めてで、仕事中のプロジェクトのspring-bootをチェックしています。私はガイドに従っていましたが、最終的に(半)動作するWebアプリMVC + JPAをデータアクセス用に使用しました。 Jarメソッドを介してアプリをデプロイすると、すべてが機能します。

Java -jar build/libs/client.jar

ただし、アプリケーションは最終的にTomcat(v7.0.40)にデプロイされるため、プロジェクトからwarファイルを作成する必要があります。 spring-ioサイトで jarを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がロードしないのですか?私は全面的に検索してみましたが、この問題を抱えている人は誰もいないようです。

前もって感謝します。

26
loganasherjones

このアドバイスに従う: http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

試してください:

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

それから勝利のためのブームソース。

24
codecraig

問題は、@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注釈が含まれていないため、静的PropertySourcesPlaceholderConfigurer Beanの追加を提案しなくても機能します。

11
matsev

デフォルトの命名「application。[properties、yaml、etc]」をたとえば「service。[properties、yaml、etc]」に変更する人は、これを次のようにbuild.gradleタスクに追加できると思います。

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

私は同じ問題を探してここに来ました。 SpringブートアプリケーションをTomcat内でwarとして実行するとapplication.propertiesがロードされませんが、埋め込みTomcatで実行すると正常に機能していました。問題はファイル名にあることが判明しました。 application.propertiesの代わりにApplication.propertiesを使用していました。 Tomcatから実行する場合、大文字と小文字が区別されます。ここに置いて、誰かが私と同じ愚かな間違いを犯した場合

2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた設定ファイル 'file:./ config/application.xml'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル「file:./ config/application.yml」リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた設定ファイル 'file:./ config/application.properties'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた設定ファイル 'file:./ config/application .yaml 'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル' file:./ application.xml 'リソースが見つかりません2015-09-1 0 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル 'file:./ application.yml'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル 'file:./ application.properties'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル 'file:./ application.yaml 'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル' classpath:/config/application.xml 'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル 'classpath:/config/application.yml'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル「classpath:/config/application.properties」リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル「classpath:/config/application.yaml」リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル「classpath:/application.xml」リソース見つかりません2015-09-10 14:42:13,982 DEBUG osbccConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]]スキップされた構成ファイル 'classpath:/application.yml'リソースが見つかりません2015-09-10 14:42:13,982 DEBUG osbcc 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」リソースが見つかりません

0