使用UserDetailsS​​ervice时对数据库进行事务性调用

时间:2012-04-16 12:59:29

标签: java spring hibernate

我有一个标记为实体的User类,它也实现了UserDetails。我希望能够获取某个用户的某些属性,并根据其值,在getAuthorities方法中返回特定角色。然而,其中许多属性都是延迟加载的,需要Hibernate事务。

我尝试了从制作用户类@Transactional到制作UserDetailsServiceRememberMeService我使用@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;

    }

1 个答案:

答案 0 :(得分:0)

UserDetails不是Spring bean,因此Spring不会在其上查找@Transactional

我需要查看堆栈跟踪,但我假设getAuthorities()是由另一个UserDetailsService方法直接调用,即不通过事务代理。

PlatformTransactionManager注入UserDetailsService并使用TransactionTemplate中的getAuthorities()将数据库访问代码包装在交易中。