【发布时间】:2019-03-28 23:11:02
【问题描述】:
我的Spring项目中一般使用xml配置三个文件下:
applicationContext.xml: 此文件包含主要的 xml 配置:组件扫描、注释配置以及另外两个 xml 配置文件的包含:
applicationContext-db.xml 此文件包含所有数据库 bean: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中有我的数据源bean定义
<!-- 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>
我已经在同一个 applicationContext-db.xml 文件中定义的 Sessionfactory bean 中使用了这个 bean。
PS:当我删除扩展类 GlobalMethodSecurityConfiguration 时,我的数据源已定义,但我需要这个 org.springframework.security.config.annotation.method.configurationclass 来设置我的 Spring Security ACL 配置。
【问题讨论】:
-
您的
com.medkhelifi.tutorials.todolist.conf是否可用于组件扫描?我的意思是spring能找到你的配置类来注入数据源吗? -
是的,我在 applicationContext.xml 中使用:
<context:component-scan base-package="com.medkhelifi.tutorials.todolist"/> -
你可以在没有类路径的情况下试试吗?喜欢
{"conf/applicationContext-db.xml"} -
不,使用你的建议我得到:
IOException parsing XML document from ServletContext resource [/conf/applicationContext-db.xml]; -
你能放完整的日志文件吗?它无法找到给定的文件或无法解析它?
标签: java xml spring annotations autowired