我正在尝试使用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运行应用程序......一切正常(参见内存分支)。
答案 0 :(得分:7)
快速查看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;
}
答案 1 :(得分:3)
我的应用程序中也有类似的异常,当将spring oauth版本从2.0.7.RELEASE更改为2.0.3.RELEASE时,它工作正常。也许这是最新版本中的一个错误?
编辑:从错误看似问题与spring创建的代理有关。当我将代理类型更改为CGLIB而不是默认动态代理时,它也适用于版本2.0.7。可以通过proxyTargetClass属性@EnableTransactionManagement(proxyTargetClass = true)
然而,这个解决方案对我没有吸引力,因为我更喜欢默认代理方法而不是CGLIB。这里还有一篇解释代理方法http://thecafetechno.com/tutorials/spring/spring-proxying-mechanisms/
的文章答案 2 :(得分:1)
这适用于版本2.0.7.RELEASE
@Primary
@Bean
protected AuthorizationServerTokenServices tokenServices() throws Exception{
将DefaultTokenServices更改为AuthorizationServerTokenServices后,Spring将抛出错误:
没有类型的限定bean [org.springframework.security.oauth2.provider.token.ResourceServerTokenServices] 定义:预期的单个匹配bean但找到3: defaultAuthorizationServerTokenServices,consumerTokenServices,tokenServices“}}
答案 3 :(得分:0)
我在以下组合中使用2.0.9.RELEASE时遇到了同样的问题:
的pom.xml:
...
<spring.version>4.1.4.RELEASE</spring.version>
<spring-security.version>3.2.5.RELEASE</spring-security.version>
<spring-security-oauth2.version>2.0.9.RELEASE</spring-security-oauth2.version>
...
并有相同的例外。
降级为
...
<spring-security-oauth2.version>2.0.3.RELEASE</spring-security-oauth2.version>
...
为我解决了问题。