我正在尝试使用spring和security运行一个示例应用程序,其中配置了一个JdbcTokenStore和一个具有无限生存期访问令牌的DefaultTokenServices。
使用gradle bootRun运行这个应用程序,应用程序将不会启动并抛出一个“由: java.lang.ClassCastException: com.sun.Proxy引起的”。$Proxy51不能转换为bootRun
为什么有一个代理包在DefaultTokenServices bean周围?
奇怪的是-使用InMemoryTokenStore运行应用程序.一切都很好(见内存分支)。
源代码demo/blob/master/src/main/java/demo/AuthorizationServerConfiguration.java
全跟踪:http://pastebin.com/SUcwz4S5
发布于 2015-04-28 20:27:11
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;
}
发布于 2015-04-27 10:15:08
我的应用程序中也有类似的异常,当将spring版本从2.0.7更改为2.0.3时,version起了作用。也许这是最新版本中的一个bug?
编辑:,从错误来看,问题似乎与spring创建的代理有关。当我将代理类型更改为CGLIB而不是默认的动态代理时,它也适用于2.0.7版本。此设置可以通过proxyTargetClass属性@EnableTransactionManagement(proxyTargetClass = true)
设置。
但是,这个解决方案对我没有吸引力,因为我更喜欢默认的代理方法,而不是CGLIB。这里还有一篇解释代理方法http://thecafetechno.com/tutorials/spring/spring-proxying-mechanisms/的文章
发布于 2015-05-20 05:41:13
这适用于2.0.7版。
@Primary
@Bean
protected AuthorizationServerTokenServices tokenServices() throws Exception{
在将DefaultTokenServices更改为AuthorizationServerTokenServices之后,Spring将引发一个错误:
没有定义org.springframework.security.oauth2.provider.token.ResourceServerTokenServices类型的合格bean :预期的单个匹配bean,但发现3: defaultAuthorizationServerTokenServices、consumerTokenServices、tokenServices“}
https://stackoverflow.com/questions/29845016
复制相似问题