1

UserDetailsも実装するエンティティとしてマークされたUserクラスがあります。特定のユーザーのいくつかのプロパティを取得し、それらの値に基づいて、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;

    }
4

1 に答える 1

0

これUserDetailsはSpringBeanではないため、Springは@Transactionalそれを探すつもりはありません。

スタックトレースを確認する必要がありますが、getAuthorities()が別のUserDetailsServiceメソッドによって直接呼び出されている、つまりトランザクションプロキシを経由していないと想定しています。

にインジェクトしPlatformTransactionManager、inをUserDetailsService使用してDBアクセスコードをトランザクションでラップします。TransactionTemplategetAuthorities()

于 2012-04-16T21:36:17.997 に答える