我正在开发Spring Integration支持的Web应用程序。我正在使用1.0.4.RELEASE。我使用CGLib代理。我有一个事务性消息端点。一切都正常,但我尝试了一些注释。我使用annotation-config,它工作正常。我从将服务激活器配置从xml切换到注释开始,但它失败了。
以下配置正常运行:
弹簧integration.xml
<channel id="inChannel" />
<channel id="outChannel" />
<service-activator method="myMethod" input-channel="inChannel" ref="myService" output-channel="outChannel" />
MyService.java
@MessageEndpoint
@Transactional
public class MyService {
@Autowired
private MyDao myDao;
public MyObject myMethod(String message) throws Exception {
...
}
}
尝试使用注释实现完全相同的功能(考虑到我使用CGLIB,所以我不需要接口,但默认构造函数)我
更改了MyService.java
@MessageEndpoint
@Transactional
public class MyService {
@Autowired
private MyDao myDao;
public MyService () {
}
@ServiceActivator(inputChannel="inChannel", outputChannel="outChannel")
public MyObject myMethod(String message) throws Exception {
...
}
}
我收到以下错误: java.lang.IllegalArgumentException:Superclass没有null构造函数但没有给出参数
我见过很多线程描述了以下错误article,但问题出在自定义类上。我的问题是关于Spring类。
Error creating bean with name 'myService'
nested exception is org.springframework.aop.framework.AopConfigException
Could not generate CGLIB subclass of class [class org.springframework.integration.handler.ServiceActivatingHandler]
java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
怎么了?为什么Spring尝试为spring类创建代理,而不仅仅是为MyService创建代理?我的课程被包裹了吗?我不明白发生了什么。非常感谢。
答案 0 :(得分:2)
尝试取消@Autowired
标记。这样可以查找构造函数或setter方法以填充该字段。考虑到你没有这些,这可能是问题所在。只是一个猜测。
答案 1 :(得分:1)
或者你可以使myDao包受保护或公开(以便Spring可以实际自动装配它)
例如:
@Autowired
myDao