복붙노트

[SPRING] Tomcat 봄 부팅 응용 프로그램 속성을 읽지 못함

SPRING

Tomcat 봄 부팅 응용 프로그램 속성을 읽지 못함

나는 봄 / 자바에 상당히 익숙하며 직장에있는 프로젝트에 대한 스프링 부트를 체크하고있다. 나는 가이드를 따라 왔고 마침내 데이터 액세스를 위해 (세미) 작업 웹 응용 프로그램 MVC + JPA를 가졌습니다. Jar 메서드를 통해 앱을 배포하면 모든 것이 작동합니다.

java -jar build/libs/client.jar

그러나 우리 응용 프로그램은 결국 Tomcat (v7.0.40)에 배포되므로 프로젝트에서 war 파일을 만들어야합니다. 나는 spring.io 사이트에있는 전쟁 안내서를 개조 한 항아리를 따라 갔고 문제가 발생했습니다. 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

바람둥이에 전쟁을 버리고 로그를 꼬리와 다음을보십시오 :

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 파일이 보입니다. 그래서 나는 그것이 classpath에 있어야한다고 생각합니다. 내 질문은 왜 바람둥이가 그것을로드하지 않는가? 나는 모든 것을 조사해 보았는데 아무도이 문제를 안고있는 것 같아서 그저 내가 잘못 구성했거나 확실하지 않다.

미리 감사드립니다.

해결법

  1. ==============================

    1.이 사람들의 조언을 따르십시오 : http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

    이 사람들의 조언을 따르십시오 : http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

    시험:

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

    승리를위한 붐 소스.

  2. ==============================

    2.문제는 @Configuration 클래스에서 @Value 주석을 사용하려고한다는 것입니다. @PropertySource의 JavaDoc에서 :

    문제는 @Configuration 클래스에서 @Value 주석을 사용하려고한다는 것입니다. @PropertySource의 JavaDoc에서 :

    예 : @Configuration 클래스에 다음 행을 추가하십시오.

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

    그러나 귀하의 예에서, @Configuration 어노테이션을 GreetingController 클래스 (모든 구성을 포함하지 않음)에서 Application 클래스로 이동하는 것이 더 적합한 방법입니다. Application 클래스는 @Value 어노테이션을 포함하지 않으므로 정적 PropertySourcesPlaceholderConfigurer 빈을 추가하지 않고도 작동해야합니다.

  3. ==============================

    3.나는 같은 문제를 찾고자 여기에왔다. application.properties는 봄 부팅 어플리케이션이 Tomcat 내부에서 전쟁으로 실행될 때로드되지 않지만 내장 된 Tomcat으로 실행할 때 제대로 작동했습니다. 문제는 파일 이름으로 밝혀졌습니다. application.properties 대신 Application.properties를 사용했습니다. 바람둥이에서 달릴 때 그것은 대소 문자를 구분하는 것처럼 보입니다. 누군가와 같은 어리석은 실수를 저지른 것처럼 여기에 두는 것.

    나는 같은 문제를 찾고자 여기에왔다. application.properties는 봄 부팅 어플리케이션이 Tomcat 내부에서 전쟁으로 실행될 때로드되지 않지만 내장 된 Tomcat으로 실행할 때 제대로 작동했습니다. 문제는 파일 이름으로 밝혀졌습니다. application.properties 대신 Application.properties를 사용했습니다. 바람둥이에서 달릴 때 그것은 대소 문자를 구분하는 것처럼 보입니다. 누군가와 같은 어리석은 실수를 저지른 것처럼 여기에 두는 것.

  4. ==============================

    4.예를 들어 "service. [properties, yaml, etc]"와 같이 기본 명명을 "application. [properties, yaml, etc]"로 변경하는 사람들은 build.gradle 태스크에 다음을 추가 할 수 있습니다.

    예를 들어 "service. [properties, yaml, etc]"와 같이 기본 명명을 "application. [properties, yaml, etc]"로 변경하는 사람들은 build.gradle 태스크에 다음을 추가 할 수 있습니다.

    bootRun {
        systemProperties = [
           'spring.config.name':'service'
        ]
    }
    
  5. from https://stackoverflow.com/questions/20667653/tomcat-not-reading-spring-boot-application-properties by cc-by-sa and MIT license