我已经调试了一段时间了,我希望有人能在这里提供一些线索。
我有一个使用JDK 1.6添加到Jenkins中的Maven项目,我在这个项目中使用AOP来处理数据库事务。
当我在Jenkins中运行构建版本时,我的测试用例失败,但有以下例外:-
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'dataHandlerClassificationImpl':
Injection of resource dependencies failed; nested exception is
org.springframework.beans.factory.BeanNotOfRequiredTypeException:
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData],
but was actually of type [$Proxy17]
...
...
Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException:
Bean named 'writerDataLocationImpl' must be of type [xxx.script.WriterData],
but was actually of type [$Proxy17]
...
...
DataHandlerClassificationImpl
类看起来像这样:
@Service
public class DataHandlerClassificationImpl extends DataHandler {
@Resource(name="writerDataLocationImpl")
private WriterData writerData;
...
}
WriterData
是具有多个实现的接口。
我可以从IDE中执行代码,没有任何问题。为了确定是Maven问题还是Jenkins问题,我使用命令行导航到Jenkins的项目作业文件夹,我可以运行mvn test
,没有任何错误。
我知道代理错误与AOP有关,而且我只能自动连接到接口而不是具体的类......但这里不是这样,因为我能够在Jenkins之外很好地运行代码。
有什么主意吗?谢谢。
3条答案
按热度按时间wz3gfoph1#
您是否正在Jenkins上运行Cobertura、Sonar或其他代码检测工具?请注意,
mvn site
也可能配置为在生成的site
中包含Cobertura报告。Cobertura的问题在于它执行了相当繁重的字节码插装,包括添加一些自定义接口。当Spring启动时,它为bean生成代理。如果bean至少有一个接口,它就使用标准的Java代理。否则,它会尝试创建基于类的代理。
我猜在你的例子中使用了CGLIB类代理,但是在Cobertura检测之后Spring又回到了java代理。这导致了启动错误,因为依赖注入需要类(或CGLIB子类)。
长话短说,强制使用CGLIB类代理,您会很好:
jobtbby32#
使用AspectJ也遇到了同样的问题。
有一颗豆子
在启用AOP/AspectJ之前,这是可以正常工作的,注入验证SomeResource bean是否来自类SomeResource,但是由于它是一个代理,因此会崩溃。
解决方案:对Bean使用GLIBC代理,而不是AspectJ代理。
没道理,但现在有了更明确的信息
意思是Java阻止了这个方法的反射,Spring或者Java都需要修复这个问题。
mrphzbgm3#
我在JUnit测试中遇到过这个问题。我抱怨一个
@Component
正在使用Cacheable
请查看此链接:https://github.com/spring-projects/spring-boot/issues/12194#issuecomment-368027766
对我来说,修复方法是将其添加到JUnit中