67

次の構成クラスがあります。

@Configuration
@PropertySource(name = "props", value = "classpath:/app-config.properties")
@ComponentScan("service")
public class AppConfig {

そして私は財産でサービスを持っています:

@Component 
public class SomeService {
    @Value("#{props['some.property']}") private String someProperty;

AppConfig構成クラスをテストしたいときにエラーが発生します

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String service.SomeService.someProperty; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'props' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' 

この問題はSPR-8539に記載されています

しかしとにかく、それを機能させるためにPropertySourcesPlaceholderConfigurerを構成する方法を理解することはできません 。

編集1

このアプローチは、xml構成でうまく機能します

<util:properties id="props" location="classpath:/app-config.properties" />

しかし、構成にはJavaを使用したいと思います。

4

12 に答える 12

136

@cwashが言ったように;

@Configuration
@PropertySource("classpath:/test-config.properties")
public class TestConfig {

     @Value("${name}")
     public String name;


     //You need this
     @Bean
     public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
     }

}
于 2013-09-12T07:41:03.877 に答える
35

@PropertySourceを使用する場合、プロパティは次のコマンドで取得する必要があります。

@Autowired
Environment env;
// ...
String subject = env.getProperty("mail.subject");

で取得する場合@Value("${mail.subject}")は、xmlでpropプレースホルダーを登録する必要があります。

理由: https ://jira.springsource.org/browse/SPR-8539

于 2013-03-22T03:38:32.797 に答える
16

理由@valueがうまくいかなかったのは、の代わりにが@value必要であることがわかりました。私は同じ変更を行い、それは私のために働きました、私は春の4.0.3リリースを使用しています。構成ファイルの以下のコードを使用してこれを構成しました。PropertySourcesPlaceholderConfigurerPropertyPlaceholderConfigurer

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
}
于 2014-11-27T06:56:35.963 に答える
12

@PropertySourceをSpringに登録するために、@ Beanと注釈が付けられた静的なPropertySourcesPlaceholderConfigurerを返す@Configurationクラスのメソッドは必要ありませんか?

http://www.baeldung.com/2012/02/06/properties-with-spring/#java

https://jira.springsource.org/browse/SPR-8539

于 2013-06-10T19:21:59.407 に答える
6

私もまったく同じ問題を抱えていました。@PropertySourceとうまく遊んでいません@Value。簡単な回避策は、通常どおりSpring Java構成から参照するXML構成を用意することです。@ImportResourceそのXML構成ファイルには、単一のエントリが含まれます<context:property-placeholder />(もちろん必要な名前空間セレモニーが含まれます)。他の変更@Valueを行わないと、pojoにプロパティが挿入されます@Configuration

于 2013-05-27T12:14:20.957 に答える
5

これは、Javaでこのように構成することもできます

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setIgnoreUnresolvablePlaceholders(true);
    configurer.setIgnoreResourceNotFound(true);
    return configurer;
}
于 2016-04-21T20:17:08.607 に答える
4

それは非常に複雑に見えます、あなたはただすることができません

 <context:property-placeholder location="classpath:some.properties" ignore-unresolvable="true"/>

次に、コードリファレンスで:

@Value("${myProperty}")
private String myString;

@Value("${myProperty.two}")
private String myStringTwo;

some.propertiesは次のようになります

myProperty = whatever
myProperty.two = something else\
that consists of multiline string

Javaベースの構成の場合、これを行うことができます

@Configuration
@PropertySource(value="classpath:some.properties")
public class SomeService {

そして、@value前と同じように使用して注入します

于 2012-12-05T16:55:25.540 に答える
2

重要なのは、私が知る限り、<util:propertes id = "id" location ="loc"/>は単なる省略形です。

<bean id="id" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="location" value="loc"/>
</bean>

( util:propertiesのドキュメントを参照してください)。したがって、util:propertiesを使用すると、スタンドアロンBeanが作成されます。

一方、@ PropertySourceは、ドキュメントに記載されているように、

PropertySourceをSpringの環境に追加するための便利で宣言的なメカニズムを提供するアノテーション。

@PropertySource docを参照してください)。したがって、Beanは作成されません。

その場合、「#{a ['something']}」はSpEL式(SpELを参照)であり、「 Bean'a 'から何かを取得する」ことを意味します。util:propertiesを使用すると、Beanが存在し、式は意味がありますが、@ PropertySourceを使用すると、実際のBeanは存在せず、式は無意味になります。

これを回避するには、XMLを使用するか(これが最善の方法だと思います)、またはPropertiesFactoryBeanを自分で発行して、通常の@Beanとして宣言します。

于 2013-05-31T09:40:55.880 に答える
2

Spring 4.3 RC2以降、PropertySourcesPlaceholderConfigurerまたは<context:property-placeholder>は不要になりました。@PropertySourceで直接使用できます@Value。このSpringフレームワークチケットを参照してください

Spring5.1.3.RELEASEを使用してテストアプリケーションを作成しました。にapplication.propertiesは2つのペアが含まれています。

app.name=My application
app.version=1.1

AppConfigを介してプロパティをロードします@PropertySource

package com.zetcode.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(value = "application.properties", ignoreResourceNotFound = true)
public class AppConfig {

}

Applicationを介してプロパティを挿入し、それら@Valueを使用します。

package com.zetcode;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan(basePackages = "com.zetcode")
public class Application {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    @Value("${app.name}")
    private String appName;

    @Value("${app.version}")
    private String appVersion;

    public static void main(String[] args) {

        var ctx = new AnnotationConfigApplicationContext(Application.class);
        var app = ctx.getBean(Application.class);

        app.run();

        ctx.close();
    }

    public void run() {

        logger.info("Application name: {}", appName);
        logger.info("Application version: {}", appVersion);
    }
}

出力は次のとおりです。

$ mvn -q exec:java
22:20:10.894 [com.zetcode.Application.main()] INFO  com.zetcode.Application - Application name: My application
22:20:10.894 [com.zetcode.Application.main()] INFO  com.zetcode.Application - Application version: 1.1
于 2018-12-30T21:22:11.483 に答える
0

発生している可能性のあるもう1つのことは、@Valueの注釈付きの値が静的でないことを確認することです。

于 2018-03-10T20:09:14.253 に答える
0

私の場合、depends-on = "bean1"はproperty-placeholder内にあり、問題を引き起こしていました。その依存関係を削除し、@ PostConstructを使用して同じ元の機能を実現し、新しい値も読み取ることができました。

于 2020-02-25T15:21:19.097 に答える
0

xmlで構成している場合は、追加した後

<context:property-placeholder location = "..." />

注釈がアクティブになっていることを確認してください。私の場合、次の理由でプロパティがフェッチされませんでした。

<context:annotation-config />

于 2021-08-21T14:50:39.893 に答える