当前位置: 首页 > 知识库问答 >
问题:

@Autowired字段的Spring强制cglib代理

漆雕正奇
2023-03-14

我有混合堆栈:EJB和Spring。为了将Spring自动连接到EJB,我使用SpringBeanAutowiringInterceptor(不确定这是否会影响我遇到的问题)。

Whlie试图通过以下方式自动连接bean:

@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="singleton")
@Repository
public class ClassA imlpements IfA {
    ...
}


@Scope(value="singleton")
@Repository
public class ClassB {
    @Autowired
    private ClassA classA;

    ...
}

我得到错误:

Could not autowire field: private ClassA ClassB.classA; nested exception is java.lang.IllegalArgumentException: Can not set ClassA field ClassB.classA to com.sun.proxy.$Proxy257. Please see server.log for more details.

据我所知,问题是使用了JDK代理(因为classa实现了接口ifa),而我需要cglib代理。

不确定是否相关,但我运行的是glassfish 3.1.x。

和stacktrace(部分,因为我不能在这里公开所有类名:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'classB': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ClassA ClassB.classA; nested exception is java.lang.IllegalArgumentException: Can not set ClassA field ClassB.classA to com.sun.proxy.$Proxy257.
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:912)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:855)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
    ... 89 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ClassA ClassB.classA; nested exception is java.lang.IllegalArgumentException: Can not set ClassA field ClassB.classA to com.sun.proxy.$Proxy257. Please see server.log for more details.
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
    ... 100 more
Caused by: java.lang.IllegalArgumentException: Can not set ClassA field ClassB.classA to com.sun.proxy.$Proxy257
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
    at java.lang.reflect.Field.set(Field.java:741)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:510)
    ... 102 more

共有1个答案

单于山
2023-03-14

您不应该为单例使用aop范围的代理。

在spring配置文件或类中使用 aspectj-autoproxy>@enableaspectjautoproxy(proxytargetclass=true)强制使用cglib代理。

 类似资料:
  • 问题内容: 使用vlcj组件,由于AOP代理对象为null,因此自定义组件出现。 MediaList类别 自定义MediaList类 弹簧配置类 AOP配置类 测试代码 我尝试单步跟踪,当TestMediaList构建完成时。该方法的MediaListInstance()返回正常值,但是当spring返回到代理对象时,将返回null。同时,如果您不使用AOP,我也会尝试正确返回该值。因此,我确定了

  • 我在controller中使用CGlib代理进行拦截方法,并为此添加了一些行为。但是我遇到了一个问题,当controller有autowired Bean时,它没有初始化,并且返回为null 代理生成as

  • 并在我的controller类上添加了@validated,以便对其中的所有方法进行验证: 现在,控制器方法在调用时开始抛出NullPointerExceptions,因为userService为Null;我做了一个@PostConstruct作为测试。显然,它是在一个正常的未增强的豆子上调用的,它已经正确地获得了田地。但是当通过HTTP调用控制器时,这个未增强的bean不会被调用,而是一个use

  • Spring开始抱怨: 注意,Spring数据被配置为扫描包,而上面的错误引用了包中的一个类。当我将CGlib添加到项目中时,包括Spring数据在内的一切都可以正常工作。但是发生了什么?我是一个Spring菜鸟,相当困惑。我不知道Spring Data是如何实现代理魔法的。至少官方的例子根本不包括CGlib。进一步资料: 是一个使用EntityManager自制的简单JPA-DAO:

  • 我正在开发一个spring boot应用程序。我试着开发了一些单元测试。单元测试必须在不启动容器中的应用程序的情况下运行,必须是如此快,可以在不需要大量时间的情况下运行。假设我有一个类名,如下所示: 和以下测试:

  • 问题内容: 是否仍然可以强制Hibernate 3.3或3.5使用CGLib而不是Javassist?在我的属性文件中, 但这似乎没有做到。有什么想法吗? 问题答案: 似乎有些人没有正确阅读我的答案,所以我改一下:您的表情正确,属性定义正确,应该可以使用。所以,很抱歉这个问题,但是CGlib在类路径中吗? 更新: 经过测试,对我有用。这是我在初始化时得到的输出: PS:请注意,最近已弃用CGLIB