我正致力于将Spring Security OAuth2与JWT令牌集成到Spring Boot项目中。我的身份验证服务器的配置与此sample project中的配置类似。
当OAuth2客户端在/oauth/token
上执行POST时,无法创建访问令牌。记录的具体错误是:
o.s.s.o.provider.endpoint.TokenEndpoint : Handling error: NoSuchBeanDefinitionException, No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined
我在调用AbstractTokenGranter
时将其调整到tokenServices.createAccessToken
第70行。由于此调用实际上是通过代理进行的,因此我无法轻松调试。似乎配置中的某些东西想要进行此事务。创建访问令牌在JWT中不应该是事务性的。我可以看到为什么检索访问代码是事务性的,但代码成功地超过了那一点。
为什么这可能需要PlatformTransactionManager
,我该如何提供?
答案 0 :(得分:2)
问题是您在应用程序中配置了使用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>
答案 1 :(得分:1)
我遇到了同样的问题
tokenServices.createAccessToken使用@Transactional。 因为我使用mongo DB我不需要交易。
我通过添加PseudoTransactionManager bean解决了这个问题。
@Bean
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new PseudoTransactionManager();
}
答案 2 :(得分:1)
问题是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 {
}
};
}
答案 3 :(得分:0)
我遇到了类似的PlatformTransactionManager问题,并通过以下步骤解决了这个问题:
pom.xml
(以便在内存中存储客户端)@EnableAutoConfiguration
注释中的排除类(我之前添加的DataSourceAutoConfiguration.class
已被排除)第1点和第3点是相互的。 H2配置应启用DataSourceAutoConfiguration.class。
感谢。