@Configuration class not being able to use JPA repository during its initialization causing NoSuchBeanDefinitionException

StackOverflow https://stackoverflow.com/questions/23272048

  •  09-07-2023
  •  | 
  •  

Question

I have a strange issue with a Spring @Configuration class: one of the bean defined in it will not find its dependencies.

Here is the @Configuration class:

@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();
    }


}

Here is the AdvertisementByIdOwnerPermission bean:

@Component
public class AdvertisementByIdOwnerPermission implements Permission {

    @Autowired
    private AdvertisementRepository advertisementRepository;
...

Here is the 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

I can't figure out why Spring won't find the AdvertisementRepository defined in the AdvertisementByIdOwnerPermission whereas it is properly picked by the rest of the application...

Can anyone please help?

edit 1: Information about my Spring Data Jpa usage:

Spring Data Jpa configuration:

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

}

Interface for Repository:

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

}

edit 2: I thought it might have something to do with order of initialization of my configuration classes. I tried adding @Order(Ordered.LOWEST_PRECEDENCE + 10) to my MethodSecurityConfiguration class but it still does not work.

Was it helpful?

Solution

I sorted the issue using the latest version of Spring Data Commons and Spring Data JPA as advised by Oliver Gierke here: https://stackoverflow.com/a/23347954/536299

It was actually a small bug in the version of Spring Data I was using.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top