1

@Bean アノテーションを使用したアノテーション駆動型クラスを次に示します。文字列パラメーターなしで placeholder() だけを使用する場合は機能しますが、場所を動的に変更するには placeholder(String プロパティ) が必要です。

@Configuration
public class TestPlacehodler {


    @Value("${string}")
    public static String value;

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholder(String property) {
        PropertySourcesPlaceholderConfigurer placeholder = new PropertySourcesPlaceholderConfigurer();
        placeholder.setIgnoreUnresolvablePlaceholders(true);
        placeholder.setLocation(new ClassPathResource(property));

        return placeholder;
    }

    public static void main(String[] args) {
        AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(TestPlacehodler.class);
        PropertySourcesPlaceholderConfigurer placeholder = placeholder("test.properties");
        placeholder.postProcessBeanFactory(ctx.getBeanFactory());
        System.out.println(value);

    }

私はそのような例外を持っています:

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'placeholder' defined in class TestPlacehodler: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.lang.String]: : No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:461)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1029)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:925)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:657)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:73)
    at TestPlacehodler.main(TestPlacehodler.java:26)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

    }
4

1 に答える 1

0

あなたの定義 public static PropertySourcesPlaceholderConfigurer placeholder(String property) は、Spring がメソッドにタイプの Bean を提供することを示してStringいます。String propertyパラメータを削除して、別の場所から値を取得する必要があります。

また、 と呼ぶのは正しくありません PropertySourcesPlaceholderConfigurer placeholder = placeholder("test.properties");。メソッドは Spring コンテナーによって自動的に実行されます (ただし、Spring がパラメーターを取得する場所がわからないため、現在は実行できませんproperty)。

于 2013-03-04T11:36:16.977 に答える