2014-11-10 2 views
5

Если Spring bean, сконфигурированный с JavaConfig, BeanDefinition не может разрешить BeanClassName и возвращает значение null. То же самое с xml или конфигурацией аннотаций хорошо работает. В чем проблема? Как исправить?Spring, JavaConfig, BeanDefinition и пусто getBeanClassName

Пример код с неприятностями для Spring ботинка, только добавить импорта:

interface Foo {} 

class FooImpl implements Foo {} 

@ComponentScan 
@EnableAutoConfiguration 
@Configuration 
public class App implements CommandLineRunner { 
    public static void main(String... args) { 
     SpringApplication.run(App.class, args); 
    } 

    @Bean(name = "foo") 
    Foo getFoo() { return new FooImpl(); } 

    @Autowired 
    private ConfigurableListableBeanFactory factory; 

    @Override 
    public void run(String... args) { 
     BeanDefinition definition = factory.getBeanDefinition("foo"); 
     System.out.println(definition.getBeanClassName()); 
    } 
} 

ответ

2

Я столкнулся с той же проблемой, наблюдая весенний семинар на YouTube, в котором используется конфигурация XML на основе. Конечно, мое решение не является производством готово и выглядит как взломать, но решить мою проблему:

BeanDefinition beanDefinition; 
AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) bd; 
StandardMethodMetadata factoryMethodMetadata = (StandardMethodMetadata) annotatedBeanDefinition.getFactoryMethodMetadata(); 
Class<?> originalClass = factoryMethodMetadata.getIntrospectedMethod().getReturnType(); 

Редактировать 1 Оказывается, что если вы определили свой боб вне класса конфигурационного с помощью стереотипа аннотации, все будет работать нормально:

@Configuration 
@ComponentScan(value = "foo.bar") 
public class Config {} 

и

package foo.bar.model.impl 

@Component 
class FooImpl implements Foo {...} 
Смежные вопросы