4

通过替换 BASIC auth,我成功地将 OAuth2 集成到我以前的应用程序(REST 服务)中。

然后我得到以下异常:

No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: transactionManagerDB2,transactionManager

当我移除 beantransactionManagerDB2时,它开始正常工作。我有 2 个事务管理器,因为我有 2 个连接的数据库。

由于我有 a InMemoryTokenStore,我很好奇 a 的要求TransactionManager。(以及为什么 Oauth 无法默认选择“transactionManager”)

不知何故,我通过 配置了一个 CustomeUserDetailService configureGlobal(AuthenticationManagerBuilder auth){},它在之前和现在使用单个 TransactionManager 都可以正常工作。

我使用sparklr-boot Spring Boot 应用程序将 OAuth 与我的应用程序集成。(感谢Dave Syer制作了如此简单易懂的示例)

我在用着:

  • 春天 4.2.5
  • 弹簧安全 4.0.4
  • 春季 OAuth 2.0.9
  • (没有弹簧靴)
4

1 回答 1

0

问题是 DefaultTokenServices 中的方法使用@Transactional 进行注释。因此,即使您不使用数据库,您也需要在授权服务器配置中添加这样的事务管理器 bean:

@Bean
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new ResourceTransactionManager() {
            @Override
            public Object getResourceFactory() {
                return null;
            }

            @Override
            public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
                return null;
            }

            @Override
            public void commit(TransactionStatus status) throws TransactionException {

            }

            @Override
            public void rollback(TransactionStatus status) throws TransactionException {

            }
        };
    }
于 2017-10-26T16:11:23.233 回答