带有 InMemoryTokenStore bean 创建问题的 Spring OAuth2 实现

Posted

技术标签:

【中文标题】带有 InMemoryTokenStore bean 创建问题的 Spring OAuth2 实现【英文标题】:Spring OAuth2 implementation with InMemoryTokenStore bean creation issue 【发布时间】:2015-03-29 18:27:31 【问题描述】:

我尝试使用 blog 将 Oauth2 实施到我的项目中

我是 Spring 框架的新手,所以发生了 ClassNotFoundException 等异常,尽管所有兼容的类都存在于正确的包下。 源码(maven 项目)可见github 谢谢

错误开始于:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.trafficalarm.rest.security.HierarchicalJsr250Voter] for bean with name 'roleVoter' defined in class path resource [spring/security/security-configuration.xml]; nested exception is java.lang.ClassNotFoundException: com.trafficalarm.rest.security.HierarchicalJsr250Voter
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.trafficalarm.rest.security.HierarchicalJsr250Voter] for bean with name 'roleVoter' defined in class path resource [spring/security/security-configuration.xml]; nested exception is java.lang.ClassNotFoundException: com.trafficalarm.rest.security.HierarchicalJsr250Voter
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.trafficalarm.rest.filter.spring.SpringCrossOriginResourceSharingFilter] for bean with name 'corsFilter' defined in class path resource [spring/oauth/oauth2-configuration.xml]; nested exception is java.lang.ClassNotFoundException: com.trafficalarm.rest.filter.spring.SpringCrossOriginResourceSharingFilter
Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.trafficalarm.rest.security.OAuthRestEntryPoint] for bean with name 'oauthRestEntryPoint' defined in class path resource [spring/oauth/oauth2-configuration.xml]; nested exception is java.lang.ClassNotFoundException: com.trafficalarm.rest.security.OAuthRestEntryPoint
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)

【问题讨论】:

任何cmets,欢迎回答。 【参考方案1】:

确保你的 web.xml 正确初始化了 spring 上下文: [更新]

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:app-config.xml
    </param-value>
</context-param>

必须是直子。 然后,在您的 app-config 中,您可以使用

扫描所有组件
<context:component-scan base-package="your.component.package.here"/>

然后你导入你所有的 spring 配置文件

<import resource="classpath:your-resource.xml"/>

我还注意到 PropertiesPlaceholderConfigurer bean 没有正确配置,所以我不得不在我的一个 spring 配置文件上做这样的事情,它到处抛出异常,因为 spring 没有找到文件属性:

<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location"  value="WEB-INF/application.properties"/>`</bean>`

有些课程您实际上并不需要,但这取决于您。希望你能通过这些提示弄清楚。

问候

【讨论】:

非常感谢您的回复。我想我已经根据您的信息尝试了您的。但什么都没有改变。我在 web xml 中导入 spring-business.xml。 github.com/webyildirim/trafikhaberci/blob/master/src/main/… 然后在 business-config.xml 中导入安全配置文件。 github.com/webyildirim/trafikhaberci/blob/master/src/main/… 问候。 其实我是用那个例子在我的项目中实现的,我注意到有些组件没有正确定义。 是的,你指出了我正确的方向。但仍然给出:创建 bean 'userConfiguration' 错误:自动装配依赖项的注入失败;嵌套除外。是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.springframework.security.oauth2.provider.token.DefaultTokenServices com.trafficalarm.rest.configuration.UserConfiguration.tokenServices;嵌套异常是 java.lang.IllegalArgumentException: Can not set org.springframework.security.oauth2.provider.token.DefaultTokenServices field com....UserConfiguration.tokenServices to com.sun.proxy.$Proxy67 好吧,抛出异常是因为 Spring 尝试实例化您的令牌服务类,但是,记住它有一些依赖项,我猜有一些存储库和密码编码器,Spring 必须首先实例化这些依赖项为了注入你的令牌服务。密码编码器和其他服务,可以注册为 XML bean(想法是不要有很多 XML spring config) 感谢您的回复。这个问题在这个question 中得到了解决。谢谢你【参考方案2】:

关于异常的根本问题是构建路径问题。当我将 security-configuration.xml 文件内容移动到 business-config.xml 时,ide 警告我构建路径问题。所以我检查了项目的构建路径,maven依赖似乎没有被选中。我之前更改了 JDK 的版本,所以我认为这导致了未经检查的情况。不幸的是,注意到需要一段时间......

【讨论】:

以上是关于带有 InMemoryTokenStore bean 创建问题的 Spring OAuth2 实现的主要内容,如果未能解决你的问题,请参考以下文章

Weblogic 所有BEA错误代码详细信息列表

ORA-0 [BEA][Oracle JDBC Driver] 未处理的 sql 类型

BEA-141281 unable to get file lock

weblogic安装错误BEA-090870解决方案

NoClassDefFoundError: bea/jmapi/MethodProfileData 使用 JRockit Mission Control 分析应用程序时

webservice wsdl axis2报错 Provider com.bea.xml.stream.MXParserFactory not found