java Spring Social -无法生成CGLIB子类

xtfmy6hx  于 2023-01-19  发布在  Java
关注(0)|答案(5)|浏览(276)

我在尝试导航到spring social web模块的/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>

感谢您的回复。

vecaoik1

vecaoik11#

我发现这个链接很有用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 ="false"**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>

希望这对你有帮助。编码愉快:)

gjmwrych

gjmwrych2#

我有类似的问题,但我没有使用任何xml配置,一切都是由spring-boot自动配置的。
以下是我尝试使用/connect/facebook时得到的结果:
出现错误(类型=内部服务器错误,状态=500)。创建在类路径资源[org/springframework/social/config/annotation/SocialConfiguration.class]中定义的名为'scopedTarget.connectionRepository'的Bean时出错:初始化bean失败;嵌套的异常是org.springframework.aop.framework.无法生成类[类org.springframework.social.connect.jdbc.jdbcConnectionRepository]的CGLIB子类:此问题的常见原因包括使用final类或不可见类;嵌套异常是org.springframework.cglib.core。代码生成异常:java.lang.reflect.调用目标异常--〉空
根本原因是类路径中有spring-boot-devtools。删除devtools解决了问题。我还发现了某个人打开的PR,请在那里留下评论,以引起更多人对该问题的关注。pull request
更新合并PR,从2.0.0.M1开始,dev-tools不再有问题。

f3temu5u

f3temu5u3#

对于springboot项目,有两种方法可以解决这个问题:
1.删除Spring引导-debtools依赖性。
1.在应用程序属性中设置spring.aop.proxy-target-class=false

vawmfj5a

vawmfj5a4#

我知道这个帖子很老了,但是,例外
Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class ...带我来这里。

我的解决方案是默认构造函数。

bxgwgixi

bxgwgixi5#

我的解决方案是从类定义中删除 final
我在一些Rest控制器上使用PreAuthorize注解时遇到了同样的异常。问题是控制器类被定义为 final,这导致了这样的错误。

相关问题