Feder zwingen cglib-proxies für die @Autowired-Felder
Habe ich gemischte Stapel: EJB und Spring. Für autowiring Frühjahr zu EJBs, die ich verwenden SpringBeanAutowiringInterceptor
(nicht sicher, ob das beeinflussen könnte, das problem habe ich).
Whlie versuchen, autowire Bohnen in folgender Weise:
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="singleton")
@Repository
public class ClassA imlpements IfA {
...
}
@Scope(value="singleton")
@Repository
public class ClassB {
@Autowired
private ClassA classA;
...
}
Bekomme ich Fehler:
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.
Soweit ich verstanden habe, das problem ist, dass die JDK-proxies verwendet werden (wie ClassA
implementiert das interface IfA
), während ich noch cglib lieben.
Aber ich verstehe es nicht. Auf der Grundlage der Dokumente, die Anmerkung: @Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,
tun sollten den job hier.
Gut und es ist keine option für mich, Schnittstellen verwenden, (wie ein Feld-Typ).
Keine Idee, wie Kraft cglib-proxying hier?
BEARBEITEN:
Nicht sicher, ob es relevant ist, aber ich bin mit glassfish 3.1.x.
Stacktrace und (teilweise, da kann ich nicht setzen alle Klassennamen hier:
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
- Können Sie nach einer kompletten stack-trace?
- stacktrace Hinzugefügt
- Sind Sie mit spring-data-jpa-repositories für?
- spring-data-jpa? NÖ
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht verwenden aop-scoped-Proxys für singletons.
Verwenden
<aop:aspectj-autoproxy proxy-target-class="true" />
oder@EnableAspectJAutoProxy(proxyTargetClass=true)
im spring-Konfiguration-Datei oder Klasse zu zwingen, cglib-proxies.ClassA
mit@EnableAspectJAutoProxy(proxyTargetClass=true)
noch<aop:aspectj-autoproxy proxy-target-class="true" />
. Trotzdem, nur aus Neugier: warum sollte ich nicht singletons verwenden?AutoProxyCreator
. Wissen Sie, wer ist, erstellen Sie den proxy für ClassA?<context:annotation-config />
fehlt => meine versuche mit Anmerkungen nutzlos waren. So kam ich zum Punkt, wo die Dinge anfangen zu arbeiten für mich:<bean id="classA" class="ClassA"> <aop:scoped-proxy/> </bean>
und<bean id="classB" class="ClassB"> <property name="classA" ref="classA"> </bean>
. Aber ich Frage mich, ob es eine weniger ausführliche Weise, wie die Aktivierung:<aop:scoped-proxy/>
globaly, nicht pro Klasse.