3

プログラムで AnnotationConfigApplicationContext を作成しようとしています。構成クラスのリストと、Spring XML ファイルに含まれるプロパティ ファイルのリストを取得しています。

そのファイルを使用して、XmlBeanDefinitionReader を使用し、すべての @Configuration 定義を正常にロードできます。しかし、プロパティを読み込めません。

これは、プロパティをロードするために私がやっていることです..

PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
for (String propFile : propertyFiles) {
    propReader.loadBeanDefinitions(new ClassPathResource(propFile));
}

コードは問題なく実行されますが、ctx.refresh() を呼び出すと、例外がスローされます。

Caused by: java.lang.IllegalStateException: No bean class specified on bean definition
        at org.springframework.beans.factory.support.AbstractBeanDefinition.getBeanClass(AbstractBeanDefinition.java:381)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:54)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990)

上記のプロパティをプログラムでロードしないと、すべてのクラスがクラスパスで利用可能になります (プロパティをロードするために他の方法を使用しているため)。

ここで何が間違っているのかわかりません。何か案は?ありがとう。

4

1 に答える 1

5

プロパティを手動でロードしている理由はわかりませんが、AnnotationConfigApplicationContext の Spring 標準は

@Configuration
@PropertySource({"/props1.properties", "/props2.properties"})
public class Test {
...

プログラムによる読み込みについては、PropertiesBeanDefinitionReader の代わりに PropertySourcesPlaceholderConfigurer を使用してください。この例は問題なく動作します。

@Configuration
public class Test {
    @Value("${prop1}")    //props1.properties contains prop1=val1 
    String prop1;

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(Test.class);
        PropertySourcesPlaceholderConfigurer pph = new PropertySourcesPlaceholderConfigurer();
        pph.setLocation(new ClassPathResource("/props1.properties"));
        ctx.addBeanFactoryPostProcessor(pph);
        ctx.refresh();
        Test test = ctx.getBean(Test.class);
        System.out.println(test.prop1);
    }
}

版画

val1
于 2013-01-05T02:42:01.003 に答える