我有一个标准bean,其中包含一些需要自动装配的属性。
@Service
public class MyServiceImpl implements MyService {
@Autowired
private FirstRepository first;
public MyServiceImpl() {
}
我使用Java Config查找bean:
@Configuration
@ComponentScan(basePackages = "com.company", excludeFilters = { @Filter(Configuration.class) })
public class MainConfig {
}
但是,FirstRepository Bean不存在所以我在BeanFactoryPostProcessor中创建它:
public class RepoGeneratorPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
GenericBeanDefinition jpaR = new GenericBeanDefinition();
jpaR.setBeanClass(JpaRepositoryFactoryBean.class);
jpaR.setAutowireCandidate(true);
jpaR.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
jpaR.setLazyInit(false);
jpaR.setPropertyValues(new MutablePropertyValues().add("repositoryInterface", FirstRepository.class));
RootBeanDefinition definition = new RootBeanDefinition();
definition.setBeanClass(FirstRepository.class);
definition.setAutowireCandidate(true);
definition.setFactoryBeanName("&jpaR");
definition.setFactoryMethodName("getObject");
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
definition.setLazyInit(false);
definition.setAttribute(RequiredAnnotationBeanPostProcessor.SKIP_REQUIRED_CHECK_ATTRIBUTE, Boolean.TRUE);
BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
registry.registerBeanDefinition("jpaR", jpaR);
registry.registerBeanDefinition("first", definition);
}
当我启动我的应用程序时,我得到以下异常,这似乎表明Spring无法找到FirstRepository bean。
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.company.FirstRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
如果我删除@Autowired注释,我可以在启动后看到正确创建了FirstRepository bean。
有什么建议吗?
答案 0 :(得分:0)
此异常表示在构建项目时没有为FirstRepository
类定义bean。 我在这里也看不到它。
最简单的解决方案是在application-context.xml
中使用这样的bean定义:
<bean id="firstRepository" class="your.package.FirstRepository" autowire="byName"/>
在这种情况下,启动时会有bean定义。
答案 1 :(得分:0)
我认为你不需要&amp;在
中的beanname之前definition.setFactoryBeanName("&jpaR");
我在我的项目中使用了类似的东西
definition.setFactoryBeanName("jpaR");
它按预期工作
&amp;如果你需要获取名为first的bean的工厂bean,则需要它。 &amp;首先应该返回jpaR。