没有定义bean,但定义了bean

时间:2013-03-15 17:20:39

标签: java spring grails groovy spring-security

我正在开发一个支持去年春天-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。

查看fullstack跟踪,我发现异常发生在它尝试查找我的bean的行中的spring oatuh2 server bean definition parse AuthorizationServerBeanDefinitionParser.java

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);

如果我检查

的结果
 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]

并非所有其他被淘汰的豆子......


即使我在resources.xml中移动ouath服务器声明,将自定义令牌granter bean声明保留在resources.groovy中,问题仍然存在。

但是如果我在resources.xml中移动自定义标记bean声明,问题就解决了。

2 个答案:

答案 0 :(得分:0)

我真的不知道BeanBuilder DSL是如何工作的,但是如果出现问题似乎存在问题(你的例子在XML中运行得很好)。你能分两步完成吗,所以当处理OAuth2名称时,myTokenGranter的bean定义是绝对可用的吗?

答案 1 :(得分:0)

解决了黑客攻击Spring Security Oauth

请参阅此commit