spring - 强制@Autowired字段的cglib代理 [英] spring - forcing cglib proxies for @Autowired fields
问题描述
我有混合堆栈:EJB和Spring。对于自动装配Spring到EJB,我使用 SpringBeanAutowiringInterceptor
(不确定这是否会影响我的问题)。
Whlie尝试以下列方式自动装配bean:
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value =singleton)
@Repository
公共类ClassA imlpements IfA {
...
}
@Scope(value =singleton)
@Repository
公共类ClassB {
@Autowired
私有ClassA classA;
...
}
我收到错误:
无法自动装配字段:private ClassA ClassB.classA;嵌套异常是java.lang.IllegalArgumentException:无法将ClassA字段ClassB.classA设置为com.sun.proxy。$ Proxy257。有关更多详细信息,请参阅server.log。
据我所知,问题是使用了JDK代理(如 ClassA
实现接口 IfA
),而我需要cglib。
<但是我不明白。根据文档,注释:
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,
应该在这里完成工作。 好吧,我不能选择使用接口(作为字段类型)。
任何想法如何在这里强制执行cglib代理?
编辑:
不确定它是否相关,但我正在运行glassfish 3.1.x.
和stacktrace(部分,因为我不能在这里公开所有的类名:
引起:org.springframework.beans.factory.BeanCreationException:创建名为'classB'的bean时出错:自动连接依赖项的注入失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:org.springframework.beans .factory.BeanCreationException:无法自动装配字段:private ClassA ClassB.classA;嵌套异常是java.lang.IllegalArgumentException:无法将ClassA字段ClassB.classA设置为com.sun.proxy。$ Proxy257。
at org。 SP ringframework.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)
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更多
引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private ClassA ClassB.classA ;嵌套异常是java.lang.IllegalArgumentException:无法将ClassA字段ClassB.classA设置为com.sun.proxy。$ Proxy257。有关更多详细信息,请参阅server.log。
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
引起:java.lang.IllegalArgumentException:可以未将ClassA字段ClassB.classA设置为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更多
您不应该对单身人士使用aop范围代理。
使用< ; aop:aspectj-autoproxy proxy-target-class =true/>
或 @EnableAspectJAutoProxy(proxyTargetClass = true)
在你的spring配置中要强制使用cglib代理的文件或类。
I have mixed stack: EJB and Spring. For autowiring Spring to EJBs I use SpringBeanAutowiringInterceptor
(not sure if that could affect the problem I have).
Whlie trying to autowire beans in a following way:
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="singleton")
@Repository
public class ClassA imlpements IfA {
...
}
@Scope(value="singleton")
@Repository
public class ClassB {
@Autowired
private ClassA classA;
...
}
I get error:
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.
As far as I've understood, the problem is that JDK proxies are used (as ClassA
implements interface IfA
), while I'd need cglib ones.
But I don't get it. Based on the docs, the annotation: @Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,
should do the job here.
Well and it's not an option for me to use interfaces (as a field type).
Any idea how to force cglib proxying here?
EDIT:
Not sure if it's relevant, but I'm running glassfish 3.1.x.
And stacktrace (partial, as I can't expose all the class names here:
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
You should not use aop scoped proxies for singletons.
Use <aop:aspectj-autoproxy proxy-target-class="true" />
or @EnableAspectJAutoProxy(proxyTargetClass=true)
in your spring configuration file or class to force cglib proxies.
这篇关于spring - 强制@Autowired字段的cglib代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!