Spring Social - 无法生成CGLIB子类

时间:2013-12-28 21:16:26

标签: java spring spring-social

尝试导航到spring社交网络模块的/ connect端点时出现以下错误。

我得到的是什么:

[Request processing failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'scopedTarget.connectionRepository' 
defined in ServletContext resource [/WEB-INF/appContext.xml]: 
Initialization of bean failed; nested exception is 
org.springframework.aop.framework.AopConfigException: 
Could not generate CGLIB subclass of class 
[class org.springframework.social.connect.jdbc.JdbcConnectionRepository]: 
Common causes of this problem include using a final class or a non-visible class; 
nested exception is java.lang.IllegalArgumentException: 
Superclass has no null constructors but no arguments were given]

web.xml的相关部分:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/appContext.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

appContext.xml的相关部分:

<bean id="connectionFactoryLocator" 
          class="org.springframework.social.connect.support.ConnectionFactoryRegistry">
        <property name="connectionFactories">
            <list>
                <bean class="org.springframework.social.facebook.connect.FacebookConnectionFactory">
                    <constructor-arg value="${facebook.clientId}" />
                    <constructor-arg value="${facebook.clientSecret}" />                
                </bean>
            </list>
        </property>
    </bean>

    <bean id="usersConnectionRepository" 
          class="org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository">
        <constructor-arg ref="dataSource" />
        <constructor-arg ref="connectionFactoryLocator" />
        <constructor-arg ref="textEncryptor" />
    </bean>

    <bean id="connectionRepository" factory-method="createConnectionRepository" 
          factory-bean="usersConnectionRepository" scope="request">
        <constructor-arg value="#{request.userPrincipal.name}" />
        <aop:scoped-proxy proxy-target-class="false" />
    </bean>

感谢您的回复。

3 个答案:

答案 0 :(得分:5)

我发现此链接很有用https://github.com/socialsignin/socialsignin-showcase/issues/6,它解决了我的问题。

基本上在这种情况下,问题在于AOP代理,由于某种原因,CGLIB代理在这种情况下不起作用。所以你必须将其关闭并切换到JDK代理。所以我所做的只是在我的context.xml中进行此更改 -

<tx:annotation-driven transaction-manager="transactionManager" 
    proxy-target-class="true"/>

<tx:annotation-driven transaction-manager="transactionManager" 
    proxy-target-class="false"/>

通过使 proxy-target-class =&#34; false&#34; spring将使用JDK代理(不要问为什么我不知道)。

它解决了我的问题。

但如果它对你不起作用,那么也要改变它:

<security:global-method-security proxy-target-class="false" >

和此:

<bean id="connectionFactoryLocator" class="org.springframework.social.connect.support.ConnectionFactoryRegistry">
    <property name="connectionFactories">
        <list>
            <bean class="org.springframework.social.facebook.connect.FacebookConnectionFactory">
                <constructor-arg value="xxxxxxxxxxx" />
                <constructor-arg value="xxxxxxxxxxxxxxxxxxxxxxxxxxx" />             
            </bean>
        </list>
    </property>
    <aop:scoped-proxy proxy-target-class="false"/>
</bean>

希望这有帮助。快乐的编码:)

答案 1 :(得分:3)

我有类似的问题,但是我没有使用任何xml配置,所有内容都是由spring-boot自动配置的。

以下是我尝试做/ connect / facebook的事情:

  

出现意外错误(type = Internal Server Error,   状态= 500)。使用名称创建bean时出错   &#39; scopedTarget.connectionRepository&#39;在类路径资源中定义   [组织/ springframework的/社会/配置/注解/ SocialConfiguration.class]:   bean的初始化失败;嵌套异常是   org.springframework.aop.framework.AopConfigException:不能   生成类[class]的CGLIB子类   org.springframework.social.connect.jdbc.JdbcConnectionRepository]:   这个问题的常见原因包括使用最终类或   不可见的阶级;嵌套异常是   org.springframework.cglib.core.CodeGenerationException:   java.lang.reflect.InvocationTargetException - &GT;空

根本原因是在类路径中有 spring-boot-devtools 。删除devtools解决了这个问题。我也找到了一个男人开的PR,请在那里发表评论以引起更多关注。 pull request

UPD。 PR已合并,从2.0.0.M1开始,dev-tools不再存在问题。

答案 2 :(得分:0)

有两种方法可以解决springboot项目中的这个问题:

  1. 删除 spring-boot-debtools 依赖项。
  2. 在application.properties中设置spring.aop.proxy-target-class=false