Автоматическое подключение XML-компонента в класс @Configuration - PullRequest
0 голосов
/ 24 октября 2018

Обычно я использую конфигурацию xml в своем проекте Spring в трех файлах:

applicationContext.xml: Этот файл содержит основную конфигурацию xml: сканирование компонентов, annotation-config, а такжевключает два других файла конфигурации xml:

applicationContext-db.xml Этот файл содержит все компоненты базы данных: dataSource, SessionFactory, ...

applicationContext-security.xml Этот файл содержит все настройки безопасности Spring.

Мне нужно использовать также Spring Security ACL, для этого я создал класс конфигурации:

AclMethodSecurityConfiguration.java

package com.medkhelifi.tutorials.todolist.conf;

/**
/* all imports goes here.
**/

@Configuration
@ImportResource({"classpath*:conf/applicationContext-db.xml"})
@EnableGlobalMethodSecurity (prePostEnabled = true, securedEnabled = true)
public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

    @Autowired
    DataSource dataSource;

    @Bean
    public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService());
        expressionHandler.setPermissionEvaluator(permissionEvaluator);
        return expressionHandler;
    }


    @Bean
    public JdbcMutableAclService aclService() {
        return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());
    }

    @Bean
    public AclAuthorizationStrategy aclAuthorizationStrategy() {
        return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN"));
    }


    @Bean
    public PermissionGrantingStrategy permissionGrantingStrategy() {
        return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger());
    }


    @Bean
    public EhCacheBasedAclCache aclCache() {
        return new EhCacheBasedAclCache(
                    aclEhCacheFactoryBean().getObject(),
                    permissionGrantingStrategy(),
                    aclAuthorizationStrategy()
                    );
    }

    @Bean
    public EhCacheFactoryBean aclEhCacheFactoryBean() {
        EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean();
        ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject());
        ehCacheFactoryBean.setCacheName("aclCache");
        return ehCacheFactoryBean;
    }

    @Bean
    public EhCacheManagerFactoryBean aclCacheManager() {
        return new EhCacheManagerFactoryBean();
    }

    @Bean
    public LookupStrategy lookupStrategy() {
        return new BasicLookupStrategy(
                    dataSource,
                    aclCache(),
                    aclAuthorizationStrategy(),
                    new ConsoleAuditLogger());
    }
}

Моя проблема в том, что источник данных, автоматически подключенный к файлу конфигурации, пуст, я не знаю, пропустил ли я что-то.

Все мои файлы XML находятся в каталоге: src / main /resources / conf /

В applicationContext-db.xml

<!--        DATASOURCE                      -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${database.driver}"/>
    <property name="url" value="${database.url}"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
</bean>

есть мое определение bean-компонента источника данных. Я уже использовал этот bean-компонент в определенном bean-компоненте Sessionfactory.В том же файле applicationContext-db.xml.

PS: Когда я удаляю расширенный класс GlobalMethodSecurityConfiguration, мой источник данных определен, но мне нужен этот класс org.springframework.security.config.annotation.method.configuration для настройки моего ACL Spring Securityконфигурации.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я нашел способ определить bean-компонент источника данных с помощью интерфейса BeanFactoryAware.BeanFactoryAware используется для внедрения объекта BeanFactory.Таким образом, мы получаем доступ к BeanFactory, которая создала объект.

@EnableGlobalMethodSecurity (prePostEnabled = true, securedEnabled = true)
@Configuration
@ImportResource({"classpath:/conf/applicationContext-db.xml"})
public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration implements BeanFactoryAware {

    DataSource dataSource;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.dataSource = beanFactory.getBean("dataSource", DataSource.class);
    }
    // rest of code goes here 
}

Я прочитал, что если мы используем эту технику, которая означает, что мы делаем что-то не так, я продолжу поиск правильного решения.

0 голосов
/ 24 октября 2018

Пожалуйста, переименуйте ваш боб в name="dataSource"

...