1

自動配線する必要があるいくつかのプロパティを持つ標準 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 が適切に作成されていることがわかります。

助言がありますか?

4

2 に答える 2

0

beanname の前に & は必要ないと思います

definition.setFactoryBeanName("&jpaR");

私は自分のプロジェクトでそのようなものを使用しました

definition.setFactoryBeanName("jpaR");

そして、それは期待どおりに機能しました

最初に名前が付けられた Bean のファクトリー Bean を取得する必要がある場合は、& が必要です。&first は jpaR を返す必要があります。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-extension-factorybean

于 2016-01-17T11:31:05.653 に答える
0

FirstRepositoryこの例外は、プロジェクトのビルド時にクラスに定義された Bean がないことを示しています。ここでも見ることができません。

最も簡単な解決策は、次のように Bean を定義するapplication-context.xmlことです。

<bean id="firstRepository" class="your.package.FirstRepository" autowire="byName"/>

この場合、起動時にその Bean 定義が存在します。

于 2012-09-01T05:51:00.803 に答える