我有一个标记为实体的User类,它也实现了UserDetails。我希望能够获取某个用户的某些属性,并根据其值,在getAuthorities
方法中返回特定角色。然而,其中许多属性都是延迟加载的,需要Hibernate事务。
我尝试了从制作用户类@Transactional
到制作UserDetailsService
和RememberMeService
我使用@Transactional
的任何内容。这些都不起作用!
我的所有其他DAO和Service类都映射为事务性工作(它们只是简单的类 - 除了@Transactional之外没有其他注释)
更新:这是类User
中的重写getUserDetails@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
GrantedAuthority auth = new GrantedAuthority() {
@Override
public String getAuthority() {
// TODO Auto-generated method stub
return "ROLE_USER";
}
};
ArrayList<GrantedAuthority> result = new ArrayList<GrantedAuthority>();
if (options.size() > 0) {
for (Option o : options) {
result.add(createAuthority(Option.getStringType(o.type)));
}
}
result.add(auth);
return result;
}
答案 0 :(得分:0)
UserDetails
不是Spring bean,因此Spring不会在其上查找@Transactional
。
我需要查看堆栈跟踪,但我假设getAuthorities()是由另一个UserDetailsService
方法直接调用,即不通过事务代理。
将PlatformTransactionManager
注入UserDetailsService
并使用TransactionTemplate
中的getAuthorities()
将数据库访问代码包装在交易中。