26

私は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

war を 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 に答える
0

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

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