【问题标题】:No bean named but bean is defined没有命名 bean 但定义了 bean
【发布时间】:2013-03-18 22:26:24
【问题描述】:

我正在开发支持上一个 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。

查看完整堆栈跟踪,我发现异常发生在尝试查找我的 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]

并不是所有其他已清除的豆子......


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

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

【问题讨论】:

  • 你尝试在 spring-security-oauth 论坛发帖吗?
  • @OhadR 不,我会试试的。谢谢。

标签: java spring grails groovy spring-security


【解决方案1】:

我真的不知道 BeanBuilder DSL 是如何工作的,但如果出现问题,问题似乎就存在(您的示例在 XML 中工作得很好)。能不能分两步做,这样在处理OAuth2命名空间的时候,myTokenGranter的bean定义肯定是可用的?

【讨论】:

  • “两步”是什么意思?
【解决方案2】:

解决了黑客攻击 Spring Security Oauth

看到这个commit

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2012-05-29
    • 2011-12-08
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多