1

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

我尝试了从制作用户类@Transactional到制作我使用的UserDetailsServiceand的任何方法。这些都不起作用!RememberMeService@Transactional

我的所有其他 DAO 和服务类都映射为事务性工作(它们只是简单的类 - 除了顶部的 @Transactional 之外没有其他注释)

更新:这是用户类中覆盖的 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;

    }
4

1 回答 1

0

不是 Spring bean,因此UserDetailsSpring 不会@Transactional在它上面寻找。

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

将 in注入PlatformTransactionManager您的UserDetailsService并使用TransactionTemplateingetAuthorities()将您的数据库访问代码包装在事务中。

于 2012-04-16T21:36:17.997 回答