私は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 がロードしないのはなぜですか? あちこち検索してみましたが、この問題を抱えている人は他にいないようですので、設定が間違っているだけなのか、何なのかわかりません。
前もって感謝します。