2013-03-04 2 views
1

Ниже приведен аннотированный класс с аннотацией @Bean. Когда у меня есть только placeholder() без каких-либо параметров String, это работает, но мне нужно заполнить (свойство String), чтобы динамически изменять местоположение.Метод @Bean с параметром 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) 

    } 

ответ

0

Ваш Defenition public static PropertySourcesPlaceholderConfigurer placeholder(String property) говорит весной, чтобы обеспечить некоторый боб типа String методу. Вам нужно удалить параметр String property и получить его значение из другого места.

Также неверно позвонить по телефону PropertySourcesPlaceholderConfigurer placeholder = placeholder("test.properties");. Метод будет выполняться контейнером Spring автоматическим способом (но в настоящее время это невозможно, потому что Spring неизвестна где get параметр property).

+0

Большое спасибо. Я заменил его на статический метод getter, и он просто работает, как я хочу. – ServerSideCat

+0

@Michail Я попытался найти инъекцию параметров методов '@ Bean' в документации Spring. У вас есть ссылка? Благодаря! – btiernay

Смежные вопросы