spring - 强制@Autowired字段的cglib代理 [英] spring - forcing cglib proxies for @Autowired fields

查看:227
本文介绍了spring - 强制@Autowired字段的cglib代理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有混合堆栈: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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆