@Configuration类在初始化期间无法使用JPA存储库导致NoSuchBeanDefinitionException

时间:2014-04-24 14:36:33

标签: spring spring-data-jpa

我对Spring @Configuration类有一个奇怪的问题:其中定义的bean之一将找不到它的依赖项。

以下是@Configuration类:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

    @Override
    protected AuthenticationManager authenticationManager() {
        AuthenticationManager authenticationManager = new ProviderManager();
        return authenticationManager;
    }

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(permissionEvaluator());
        return expressionHandler;
    }

    @Bean
    public ApplicationPermissionEvaluator permissionEvaluator() {
        return new ApplicationPermissionEvaluator(permissionMap());
    }

    private Map<String, Permission> permissionMap() {
        Map<String, Permission> map = new HashMap<>();
        map.put("updateAdvertisementIsAllowed", advertisementOwnerPermission());
        map.put("advertisementByIdOwnerPermission", advertisementByIdOwnerPermission());

        return map;
    }

    @Bean
    public AdvertisementOwnerPermission advertisementOwnerPermission() {
        return new AdvertisementOwnerPermission();
    }

    @Bean
    public AdvertisementByIdOwnerPermission advertisementByIdOwnerPermission() {
        return new AdvertisementByIdOwnerPermission();
    }


}

这是AdvertisementByIdOwnerPermission bean:

@Component
public class AdvertisementByIdOwnerPermission implements Permission {

    @Autowired
    private AdvertisementRepository advertisementRepository;
...

这是stacktrace:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'advertisementByIdOwnerPermission': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.bignibou.repository.advertisement.AdvertisementRepository com.bignibou.configuration.security.permission.AdvertisementByIdOwnerPermission.advertisementRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.bignibou.repository.advertisement.AdvertisementRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:324)
    at com.bignibou.configuration.security.MethodSecurityConfiguration$$EnhancerBySpringCGLIB$$b8785a07.advertisementByIdOwnerPermission(<generated>)
    at com.bignibou.configuration.security.MethodSecurityConfiguration.permissionMap(MethodSecurityConfiguration.java:49)
    at com.bignibou.configuration.security.MethodSecurityConfiguration.permissionEvaluator(MethodSecurityConfiguration.java:41)
    at com.bignibou.configuration.security.MethodSecurityConfiguration$$EnhancerBySpringCGLIB$$b8785a07.CGLIB$permissionEvaluator$6(<generated>)
    at com.bignibou.configuration.security.MethodSecurityConfiguration$$EnhancerBySpringCGLIB$$b8785a07$$FastClassBySpringCGLIB$$82172390.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312)
    at com.bignibou.configuration.security.MethodSecurityConfiguration$$EnhancerBySpringCGLIB$$b8785a07.permissionEvaluator(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166)
    ... 60 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.bignibou.repository.advertisement.AdvertisementRepository com.bignibou.configuration.security.permission.AdvertisementByIdOwnerPermission.advertisementRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.bignibou.repository.advertisement.AdvertisementRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
    ... 81 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.bignibou.repository.advertisement.AdvertisementRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
    ... 83 more

我无法弄清楚为什么Spring无法找到AdvertisementRepository中定义的AdvertisementByIdOwnerPermission,而应用程序的其余部分正确选择它...

有人可以帮忙吗?

编辑1 :有关我的Spring Data Jpa用法的信息:

Spring Data Jpa配置:

@Configuration
@EnableJpaRepositories(basePackages = "com.bignibou.repository")
public class JpaConfiguration {

}

存储库接口:

@RooJpaRepository(domainType = Advertisement.class)
public interface AdvertisementRepository {

}

编辑2 :我认为这可能与我的配置类的初始化顺序有关。我尝试将@Order(Ordered.LOWEST_PRECEDENCE + 10)添加到我的MethodSecurityConfiguration类中,但它仍然不起作用。

1 个答案:

答案 0 :(得分:0)

我根据Oliver Gierke的建议使用最新版本的Spring Data Commons和Spring Data JPA对此问题进行了排序:https://stackoverflow.com/a/23347954/536299

这实际上是我使用的Spring Data版本中的一个小错误。