【问题标题】:Making transactional calls to the DB when using UserDetailsService使用 UserDetailsS​​ervice 时对数据库进行事务调用
【发布时间】:2012-04-16 12:59:29
【问题描述】:

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

我尝试了从创建用户类@Transactional 到创建我使用@TransactionalUserDetailsServiceRememberMeService。这些都不起作用!

我所有的其他 DAO 和服务类都映射为事务性工作(它们只是简单的类 - 除了顶部的 @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;

    }

【问题讨论】:

  • 不清楚问题是什么?然后延迟加载您的授权,或更改为渴望获取...
  • @Transactional 不起作用。至少在那种情况下
  • 错误信息是什么?显示一些代码。您是否坚持授予每个用户授予权限 - 只需像对待任何其他属性一样对待它。
  • 这个异常是众所周知的 - 没有会话绑定到线程:)
  • 大声笑,是的,我对此很熟悉。您是否在刷新/提交之前两次调用同一会话? stackoverflow.com/questions/9721004/…

标签: java spring hibernate


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2019-06-01
    • 2016-01-24
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2013-04-25
    • 2020-01-03
    相关资源
    最近更新 更多