我碰到一个比较纳闷的问题:
我定义了一个类为:/**
* AcegiCacheManagerFactoryBean 负责初始化缓存后生成AcegiCacheManager
* 调用 authenticationService 来获取资源和用户实例,并加入UserCache 和 ResourceCache 中
* @author zhanghg
*
*/
public class AcegiCacheManagerFactoryBean implements FactoryBean,InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); private AcegiCacheManager acegiCacheManager;
private AuthenticationService authenticationService;
private UserCache userCache;
private ResourceCache resourceCache; public Object getObject() throws Exception {
return this.acegiCacheManager;
} @SuppressWarnings("unchecked")
public Class getObjectType() {
return (this.acegiCacheManager != null ? this.acegiCacheManager.getClass() : AcegiCacheManager.class);
} public boolean isSingleton() {
return true;
} public void afterPropertiesSet() throws Exception {
logger.info("Initializing SecurityCacheManager");
Assert.notNull(userCache,"userCache should not be null");
Assert.notNull(resourceCache,"resourceCache should not be null");
Assert.notNull(authenticationService,"Authentication Service should not be null"); //初始化缓存
List<Staff> users =authenticationService.getUsers();
for (Iterator iter = users.iterator(); iter.hasNext();) {
UserDetails user = (UserDetails) iter.next();
userCache.putUserInCache(user);
}
List<Resource> rescs =authenticationService.getResources();
for (Iterator iter = rescs.iterator(); iter.hasNext();) {
Resource resc = (Resource) iter.next();
resourceCache.putResourceInCache(resc);
}
//生成 acegiCacheManager
this.acegiCacheManager = new AcegiCacheManager(userCache,resourceCache);
} //-------------setters----------- public void setAcegiCacheManager(AcegiCacheManager acegiCacheManager) {
this.acegiCacheManager = acegiCacheManager;
} @Required
public void setAuthenticationService(AuthenticationService authenticationService) {
this.authenticationService = authenticationService;
}
@Required
public void setUserCache(UserCache userCache) {
this.userCache = userCache;
}
@Required
public void setResourceCache(ResourceCache resourceCache) {
this.resourceCache = resourceCache;
}}
我定义了一个类为:/**
* AcegiCacheManagerFactoryBean 负责初始化缓存后生成AcegiCacheManager
* 调用 authenticationService 来获取资源和用户实例,并加入UserCache 和 ResourceCache 中
* @author zhanghg
*
*/
public class AcegiCacheManagerFactoryBean implements FactoryBean,InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); private AcegiCacheManager acegiCacheManager;
private AuthenticationService authenticationService;
private UserCache userCache;
private ResourceCache resourceCache; public Object getObject() throws Exception {
return this.acegiCacheManager;
} @SuppressWarnings("unchecked")
public Class getObjectType() {
return (this.acegiCacheManager != null ? this.acegiCacheManager.getClass() : AcegiCacheManager.class);
} public boolean isSingleton() {
return true;
} public void afterPropertiesSet() throws Exception {
logger.info("Initializing SecurityCacheManager");
Assert.notNull(userCache,"userCache should not be null");
Assert.notNull(resourceCache,"resourceCache should not be null");
Assert.notNull(authenticationService,"Authentication Service should not be null"); //初始化缓存
List<Staff> users =authenticationService.getUsers();
for (Iterator iter = users.iterator(); iter.hasNext();) {
UserDetails user = (UserDetails) iter.next();
userCache.putUserInCache(user);
}
List<Resource> rescs =authenticationService.getResources();
for (Iterator iter = rescs.iterator(); iter.hasNext();) {
Resource resc = (Resource) iter.next();
resourceCache.putResourceInCache(resc);
}
//生成 acegiCacheManager
this.acegiCacheManager = new AcegiCacheManager(userCache,resourceCache);
} //-------------setters----------- public void setAcegiCacheManager(AcegiCacheManager acegiCacheManager) {
this.acegiCacheManager = acegiCacheManager;
} @Required
public void setAuthenticationService(AuthenticationService authenticationService) {
this.authenticationService = authenticationService;
}
@Required
public void setUserCache(UserCache userCache) {
this.userCache = userCache;
}
@Required
public void setResourceCache(ResourceCache resourceCache) {
this.resourceCache = resourceCache;
}}
解决方案 »
- 关于hibernate项目中,把不用的表删除的问题
- 关于j2ee的提问,如何利用hibernate与spring与mysql数据库连接
- apache+tomcat如何配置域名呢.
- hibernate search 的问题,求助高手!
- jsp 不能在jboss4.0.2中热部署
- 关于java基础list的一个问题
- 如果用struts实现动态(不定数量)多文件上传(急急急)?
- 高分求搜索引擎方面的英文文献及翻译,交毕业论文用!
- applet嵌入在jsp页面中,applet中有一个jbutton按钮,想通过这个按钮来关闭这个jsp页面,不知道如何实现?
- 高难度问题,各位大虾快来抢分吧
- 用JSP开发网站的步骤
- 新手入门,请大家多多帮忙
* AcegiCacheManager是对缓存进行统一管理,以屏蔽其它类对缓存的直接操作
* 对缓存中的用户和资源进行初始化、增、删、改、清空等操作
* @author zhanghg
*
*/
public class AcegiCacheManager { private UserCache userCache;
private ResourceCache resourceCache; //rescTypeMapp 映射资源类型对应的资源的一对多关系,以便快速查找。
//如method类型对应哪些资源实例,url资源类型对应哪些资源实例
private Map<String,List<String>> rescTypeMapping; //-----constructor using fields
@SuppressWarnings("unchecked")
public AcegiCacheManager(UserCache userCache, ResourceCache resourceCache) {
System.out.println("实例化SecurityManager");
this.userCache = userCache;
this.resourceCache = resourceCache; // 获取所有的资源,以初始化 rescTypeMapping
rescTypeMapping = new HashMap<String,List<String>>();
List<String> resclist = resourceCache.getAllResources();
for (Iterator iter = resclist.iterator(); iter.hasNext();) {
String resString = (String) iter.next();
System.out.println("初始化SecurityCacheManager时取得资源信息的path:"+resString);
ResourceDetails resc = resourceCache.getResourceFromCache(resString);
System.out.println("输出该资源的type类型为:"+resc.getResourceType());
List<String> typelist = rescTypeMapping.get(resc.getResourceType());
if(typelist==null){
typelist = new ArrayList<String>();
rescTypeMapping.put(resc.getResourceType(), typelist);
}
typelist.add(resString);
}
System.out.println("输出最终的resTypeMapping信息:"+rescTypeMapping.size());
} //-----get from cache methods
public UserDetails getUser(String username) {
return userCache.getUserFromCache(username);
} public ResourceDetails getResourceFromCache(String resString) {
return resourceCache.getResourceFromCache(resString);
} //-----remove from cache methods
public void removeUser(String username){
userCache.removeUserFromCache(username);
} public void removeResource(String resString){
ResourceDetails rd = resourceCache.getResourceFromCache(resString);
List<String> typelist = rescTypeMapping.get(rd.getResourceType());
typelist.remove(resString);
resourceCache.removeResourceFromCache(resString);
} //------add to cache methods
public void addUser(String username, String password, boolean enabled, boolean accountNonExpired,
boolean credentialsNonExpired, boolean accountNonLocked, GrantedAuthority[] authorities){
User user = new User(username, password, enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked, authorities);
addUser(user);
} public void addUser(UserDetails user){
System.out.println("进来,添加user至缓存");
userCache.putUserInCache(user);
} public void addResource(String resourceName,String resString, String resType, GrantedAuthority[] authorities){
Resource rd = new Resource(resourceName,resString, resType, authorities);
addResource(rd);
} public void addResource(ResourceDetails rd){
List<String> typelist = rescTypeMapping.get(rd.getResourceType());
if(typelist==null){
typelist = new ArrayList<String>();
rescTypeMapping.put(rd.getResourceType(), typelist);
}
typelist.add(rd.getPath());
resourceCache.putResourceInCache(rd);
} // ------renovate cache methods
public void renovateUser(String orgUsername, String username, String password, boolean enabled, boolean accountNonExpired,
boolean credentialsNonExpired, boolean accountNonLocked, GrantedAuthority[] authorities){
removeUser(orgUsername);
addUser(username, password, enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked, authorities);
} public void renovateUser(String orgUsername, UserDetails user){
removeUser(orgUsername);
addUser(user);
} public void renovateResource(String resName,String orgResString,String resString, String resType, GrantedAuthority[] authorities ){
removeResource(orgResString);
addResource(resName,resString, resType, authorities);
} public void renovateResource(String orgResString,ResourceDetails rd){
removeResource(orgResString);
addResource(rd);
} //-------getters and setters-------------------
public void clearResources() {
rescTypeMapping = new HashMap<String,List<String>>();
resourceCache.removeAllResources();
} public void setResourceCache(ResourceCache resourceCache) {
this.resourceCache = resourceCache;
} public void setUserCache(UserCache userCache) {
this.userCache = userCache;
}
/**
* 根据资源类型,在rescTypeMapping职工获取所有该类型资源的对应的resource string
* @param resType
* @return List
*/
public List<String> getResourcesByType(String resType) {
return rescTypeMapping.get(resType);
} /**
* 获取所有资源的对应的resource string
* @return
*/
public List<String> getAllResources(){
return resourceCache.getAllResources();
} /**
* 获取所有用户实例对应的user name
* @return
*/
@SuppressWarnings("unchecked")
public List<String> getAllUsers(){
EhCacheBasedUserCache ehUserCache = (EhCacheBasedUserCache)userCache;
return ehUserCache.getCache().getKeys();
}}同时我的一个类:StaffManager中要用到AcegiCacheManager类
public class StaffManager { // 统一定义所有HQL
private static final String QUERY_ADMIN_HQL = "select staff from Staff staff join staff.roles as role where role.roleName=?";
private final Logger logger = LoggerFactory.getLogger(StaffManager.class); //自动装配该bean的属性
@Autowired
private StaffDao staffDao;
@Autowired
private RoleDao roleDao;
@Autowired
private PrivilegeDao privilegeDao;
@Autowired
private ResourceDao resourceDao;
private AcegiCacheManager acegiCacheManager;通过@Reqiured进行了注解.
其中我在配置文件配置了bean:
<beans:bean id="acegiCacheManager" class="com.sdcncsi.security.cache.manager.AcegiCacheManagerFactoryBean" >但是为什么staffManager当中,取到的acegiCacheManager老是null呢?
当然通过上下文的getBean("acegiCacheManager")是可以取到这个类的,不是null
private ResourceDao resourceDao;
@Autowired
private AcegiCacheManager acegiCacheManager; -----------------------------------------------------------
我试了后不行:
1)我的配置文件中配置了:
<beans:bean id="acegiCacheManager" class="com.sdcncsi.security.cache.manager.AcegiCacheManagerFactoryBean" >
它 是指向工厂类的,这样在启动的时候可以初始化信息.
后来,我把AcegiCacheManagerFactoryBean进行了@Component("acegiCacheManager")
并且在StaffManager中对 AcegiCacheManager acegiCacheManager 启用@Autowired,
提示:Could not autowire field:
rror creating bean with name 'acegiCacheManager': FactoryBean which is currently in creation returned null from getObject 我该如何做才对啊?
直接get,set能够得到AcegiCacheManager吗?