Spring OAuth2需要平台TransactionManager

Spring OAuth2需要平台TransactionManager,spring,spring-security,oauth-2.0,spring-security-oauth2,Spring,Spring Security,Oauth 2.0,Spring Security Oauth2,我正在将SpringSecurityOAuth2与JWT令牌集成到SpringBoot项目中。我的身份验证服务器的配置与此中的配置类似 当OAuth2客户端在/oauth/token上执行POST时,它无法创建访问令牌。记录的具体错误是: o、 s.s.o.provider.endpoint.TokenEndpoint:处理错误:NoSuchBeanDefinitionException,未定义[org.springframework.transaction.PlatformTransacti

我正在将SpringSecurityOAuth2与JWT令牌集成到SpringBoot项目中。我的身份验证服务器的配置与此中的配置类似

当OAuth2客户端在
/oauth/token
上执行POST时,它无法创建访问令牌。记录的具体错误是:


o、 s.s.o.provider.endpoint.TokenEndpoint:处理错误:NoSuchBeanDefinitionException,未定义[org.springframework.transaction.PlatformTransactionManager]类型的合格bean

在调用
tokenServices.createAccessToken
时,我已将其调试到
AbstractTokenGranter
第70行。除此之外,我无法轻松调试,因为此调用实际上是通过代理进行的。配置中似乎有什么东西想让它成为事务性的。在JWT中,创建访问令牌不应该是事务性的。我可以理解为什么检索访问代码是事务性的,但是代码成功地通过了这一点


为什么这可能需要
平台TransactionManager
以及我如何提供它?

问题是,您在应用程序中配置了一个内存中数据库的用法,使用了
new InMemoryTokenStore()
,但spring boot应用程序不包含内存中数据库

解决方案:在内存数据库中添加spring boot pom或gradle依赖项

H2和Maven pom示例:

<dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.187</version>
</dependency>

com.h2数据库
氢
1.4.187

我遇到了类似的PlatformTransactionManager问题,并通过以下步骤解决了它:

  • 将H2数据库添加到
    pom.xml
    (以便在内存中存储客户端)
  • 使用MongoDB作为应用程序后端。(确保应用程序使用MongoRepository而不是Crudepository)
  • 删除了
    @EnableAutoConfiguration
    注释中的排除类(我之前在排除中添加了
    DataSourceAutoConfiguration.class
  • 第1点和第3点是相互的。H2配置应启用DataSourceAutoConfiguration.class


    谢谢。

    我也有同样的问题

    tokenServices.createAccessToken使用@Transactional。 由于我使用mongo DB,所以不需要事务

    我通过添加一个伪TransactionManager bean解决了这个问题

    @Bean
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new PseudoTransactionManager();
    }
    

    问题是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 {
    
                }
            };
        }
    

    谢谢你的建议,但我没有使用任何SQL数据库。问题:你把注册的客户存储在哪里?再给你一个提示。默认DefaultTokenService的spring内部spring实现用@Transactional注释(第81行)。您需要任何类型的事务管理器。我给你看了两个soloution。在没有事务注释的情况下实现您自己的令牌服务,或者在内存数据库中添加一个作为依赖项的令牌服务。这与提供内存数据库无关。Sprin Oauth InMemory实现使用映射来存储键和值。@FlorianE。我想将权限存储在一个单独的表中,但是
    DefaultTokenService
    中的
    getAccessToken
    没有用
    @Transactional
    注释。因此,我得到了一个延迟初始化异常,您知道是否有任何理由不代理get方法吗?