我正在开发支持去年 spring-oauth 的 grail-oauth-plugin 的更新版本
我的插件版本运行良好,并且我已经实现了一个工作 oauth2 服务器。
但现在我想添加一个像这样定义的自定义授权
def doWithSpring = {
myTokenGranter(MyTokenGranter)
xmlns oauth:"http://www.springframework.org/schema/security/oauth2"
oauth.'authorization-server'( /* ... many definitions here ... */){
/* ... many definitions here ... */
oauth.'custom-grant'('token-granter-ref': "myTokenGranter")
}
}
但我得到一个例外告诉我:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myTokenGranter'
但是 bean myTokenGranter 的定义如您所见。如果我删除自定义授权定义,项目就会启动,我可以访问 myTokenGranter bean。
查看完整堆栈跟踪,我发现异常发生在spring oatuh2 服务器 bean 定义解析 AuthorizationServerBeanDefinitionParser.java中它尝试查找我的 bean 的行中
parserContext.getRegistry().getBeanDefinition(customGranterRef);
其中 customGranterRef = "myTokenGranter"
所以我怀疑 Spring Ouath 或 Grails BeanBuilder 中存在一个错误,它不会让我的“myTokenGranter”在服务器解析器中可见。或者在 grails bean 定义 DSL 中出错。
感谢您的关注。
更深入地调试应用程序我发现问题可能在于 grails BeanBuilder 在翻译命名空间的 spring DSL 时的工作方式。
如果我调试检查我的 bean 的点(在AuthorizationServerBeanDefinitionParser.java中)
在行
parserContext.getRegistry().getBeanDefinition(customGranterRef);
如果我检查 che 结果
parserContext.getRegistry().getBeanDefinitionNames()
它只给我看这个豆子
[org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.annotation.internalPersistenceAnnotationProcessor
org.springframework.aop.config.internalAutoProxyCreator
org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0
org.springframework.transaction.interceptor.TransactionInterceptor#0
org.springframework.transaction.config.internalTransactionAdvisor
oauth2TokenGranter
oauth2AuthorizationCodeServices
oauth2AuthorizationRequestManager]
并不是所有其他的清除豆子……
即使我将 ouath 服务器声明移动到 resources.xml 中,问题仍然存在,将我的自定义令牌授予者 bean 声明保留在 resources.groovy 中。
但是,如果我在 resources.xml 中移动自定义令牌 bean 声明,问题就解决了。