spring security oauth2 ClassCastException配置DefaultTokenServices

我正在尝试使用spring boot和spring security oauth运行一个示例应用程序,其中包含已配置的JdbcTokenStore和一个具有无限生存期访问权限的DefaultTokenServices.

使用gradle bootRun运行此应用程序时,应用程序将无法启动并抛出“由以下引起:java.lang.ClassCastException:com.sun.proxy.$Proxy51无法转换为org.springframework.security.oauth2.provider.token. DefaultTokenServices”

为什么在DefaultTokenServices bean周围有代理?

奇怪的是 – 使用InMemoryTokenStore运行应用程序……一切正常(请参阅inmemory分支).

源代码https://github.com/grafjo/oauth_demo/blob/master/src/main/java/demo/AuthorizationServerConfiguration.java

完整追踪:http://pastebin.com/SUcwz4S5

最佳答案
快速浏览DefaultTokenService,可以看出它是用@Transactional注释的. Spring将把它包装在代理中以服务事务 – 因此你需要通过它的接口与类进行交互.

对于您的tokenService bean:

@Bean
public DefaultTokenServices tokenServices() {
    final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setAccessTokenValiditySeconds(-1);
    defaultTokenServices.setTokenStore(tokenStore());
    return defaultTokenServices;
}

尝试将其更改为:

@Bean
public AuthorizationServerTokenServices tokenServices() {
    final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setAccessTokenValiditySeconds(-1);
    defaultTokenServices.setTokenStore(tokenStore());
    return defaultTokenServices;
}

转载注明原文:spring security oauth2 ClassCastException配置DefaultTokenServices - 代码日志