Soru Tomcat Spring-Boot Uygulama Özelliklerini Okuma Değil


İlkbahar / java için oldukça yeni ve çalışmakta olduğum bir proje için ilkbahar-botu kontrol ediyorum. Kılavuzları takip ediyorum ve sonunda veri erişimi için bir (yarı) çalışan web uygulaması MVC + JPA var. Uygulamayı Jar yöntemiyle dağıttığımda her şey çalışıyor:

java -jar build/libs/client.jar

Ancak, bizim uygulama sonunda Tomcat (v7.0.40) dağıtılacak, bu yüzden projeden bir savaş dosyası oluşturmaya ihtiyacım var. Takip ettim kavanozları savaşa dönüştürmespring.io sitesindeki rehberi ve bir problem yaşadı. Application.properties dosyasını yüklemiyormuş gibi görünüyor. İşte önemli kod parçacıkları şunlardır:

src / main / java / merhaba / 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 / merhaba / Application.java

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

src / main / java / merhaba / 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

tamlık için, burada 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'
}

Uygulamayı yapıyorum:

gradle clean build

Savaşı tomcat'e bırakın ve ardından günlükleri kuyruğa alın ve aşağıdakini görün:

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}"
...
...
...

Söylediğim gibi, bir kavanoz aracılığıyla çalıştırdığımda çalışır, ancak Tomcat'e dağıttığımda çalışmaz. Ben de içine baktım $TOMCAT_HOME/webapps/client/WEB-INF/classes ve ben görüyorum application.properties dosya. Öyleyse bunun derste olması gerektiğini düşünüyorum. Sorum şu, neden tomcat yüklemiyor? Her yerde aramayı denedim ve hiç kimse bu problemi yaşıyor gibi görünmüyor, bu yüzden yanlış yapılandırdığım bir şey mi, yoksa ne olduğunu bilmiyorum.

Şimdiden teşekkürler.


25
2017-12-18 20:22


Menşei


İlkbahar önyüklemesi yüklenmeli application.properties varsayılan olarak. Eklemeye çalışın @PropertySource("application.properties") senin için @Configuration Bunu gerçekten bulup bulmadığını görmek için sınıf. - Sotirios Delimanolis
Hey @SotiriosDelimanolis yanıt için teşekkürler. Ne yazık ki, bu da işe yaramadı. Tomcat savaşı yüklemeye çalışırken bir FileNotFoundException aldım. Gerekirse size daha fazla bilgi verebilirim, sadece bilmeme izin verin. - loganasherjones
Üzgünüm, aslında olmalı classpath:application.properties - Sotirios Delimanolis
Tekrar teşekkürler, devam ettim ve ekledim, ancak bir derleyici uyarısı fark ettim: Cannot find annotation method 'value()' in type 'Repeatable': class file for java.lang.annotation.Repeatable not found.  Tomcat’a düşürdüğümde: Failed to load bean class: hello.Application; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable - loganasherjones
@SotiriosDelimanolis @PropertySource ek açıklama bir Spring Boot uygulamasıyla kullanılabilir, ancak eğer isterseniz bunu bildirmeniz gerekmez. classpath:application.properties (ve yapılandırılamayacak bazı çerçeve özellikleri vardır. @PropertySource) - Burada ilgili değil. - Dave Syer


Cevaplar:


bu adam tavsiyelerini takip et: http://blog.codeleak.pl/2013/11/how-to-propertysource-annotations-in.html

Deneyin:

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

sonra kazanmak için sosu boom.


21
2017-12-19 13:33



Yukarıdaki bazı yorumlar ile birlikte, bu sonunda benim için çalıştı. Sahip olduğum soru hala, neden ilk etapta özellikleri yüklemedi? Buna ek olarak, bunu denetleyici dosyama eklemek bana henüz tam olarak anlayamadığım bir derleyici uyarısı verdi. - loganasherjones
Yukarıdaki yorumumu tekrarla: Bu bir Spring Boot uygulamasında gerekli değildir. - Dave Syer
Bu oldukça tuhaf bir hataya yol açar: Java 7'de Spring Boot kullanırken "ClassCastException: java.util.Map için PropertySource kullanılamaz" - Mike Adler
@MikeAdler bu cevap anlamına gelir PropertySources çoğul, değil PropertySource tekil olan - HairOfTheDog
Teşekkür ederim ! Tamam ama nasıl yükleneceğini biliyor musun? application-xxx.properties diğer modüller dosya? - Cataclysm


Sorun şu ki, bir @Value içindeki açıklama @Configuration sınıf. JavaDoc’dan @PropertySource:

PropertySourcePlaceholderConfigurer'ı kaydettirmek için $ {...} yer tutucuları <bean> tanımlarında veya @Value açıklamalarını PropertySource'dan özelliklerini kullanarak çözmek için, bir PropertySourcesPlaceholderConfigurer öğesi kaydettirilmelidir. Bu, XML'de <context: property-placeholder> kullanılırken otomatik olarak gerçekleşir, ancak @Configuration sınıflarını kullanırken static @Bean yöntemi kullanılarak açık bir şekilde kaydedilmelidir.

Örneğin. aşağıdaki satırları ekleyin @Configuration sınıf:

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

Ancak, örneğinizde, daha uygun bir yaklaşım @Configuration ek açıklama GreetingController sınıf (herhangi bir yapılandırma içermiyor) Application sınıf. Beri Application sınıf hiç içermiyor @Value ek açıklama statik önerilen eklemeden çalışması gerekir PropertySourcesPlaceholderConfigurer fasulye.


11
2018-04-13 19:25





Buraya aynı sorunu araştırmaya geldim. bahar önyükleme uygulaması, tomcat'in içinde bir savaş olarak çalıştırıldığında yüklenmez, ancak gömülü tomcat ile çalışırken iyi çalışıyordu uygulama.properties. Sorun dosya adı olarak ortaya çıktı. Application.properties yerine Application.properties kullanmıştım. Tomcat'ten çalışırken, büyük / küçük harfe duyarlı gibi görünüyor. Onu buraya koyuyorum, eğer birisi benim yaptığım gibi aptalca bir hata yaparsa

2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'dosya: ./ config / application.xml' kaynak bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'dosya: ./ config / application.yml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'file: ./ config / application.properties' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'dosya: ./ config / application.yaml' kaynak bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'dosya: ./ application.xml' kaynak bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'dosya: ./ application.yml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'file: ./ application.properties' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'dosya: ./ application.yaml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /config/application.xml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /config/application.yml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /config/application.properties' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış config dosyası 'classpath: /config/application.yaml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /application.xml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /application.yml' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /application.properties' kaynağı bulunamadı   2015-09-10 14: 42: 13,982 DEBUG o.s.b.c.c.ConfigFileApplicationListener [ContainerBackgroundProcessor [StandardEngine [Catalina]]] Atlanmış yapılandırma dosyası 'classpath: /application.yaml' kaynağı bulunamadı


0
2017-09-10 22:11





Ben varsayılan olarak "uygulama. [Özellikler, yaml, vb]", örneğin, "hizmet. [Özellikler, yaml, vb]" için adlandırma değiştirenler için, bu build.gradle görevi olarak ekleyebilirsiniz:

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

0
2017-10-26 10:31