4

我正在开发 Spring Integration 支持的 Web 应用程序。我正在使用 1.0.4.RELEASE。我使用 CGLib 代理。我有一个事务性消息端点。一切正常,但我尝试了一些注释。我使用注释配置,效果很好。我开始将我的服务激活器配置从 xml 切换到注释,但它失败了。

以下配置正常工作:

弹簧集成.xml

<channel id="inChannel" />
<channel id="outChannel" />
<service-activator method="myMethod" input-channel="inChannel" ref="myService" output-channel="outChannel" />

我的服务.java

@MessageEndpoint
@Transactional
public class MyService {

   @Autowired
   private MyDao myDao;

   public MyObject myMethod(String message) throws Exception {
      ...
   }

}

尝试使用注释实现完全相同的功能(记住我使用 CGLIB,所以我不需要接口,但需要默认构造函数)我

  • 从我的 .xml 中删除服务激活器
  • 更改了我的服务:

更改了 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 has no null constructors but no arguments were given

我看到很多线程描述了以下错误文章,但问题是关于自定义类。我的问题与 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 创建代理?我的课以某种方式包装了吗?我不明白发生了什么。非常感谢帮助。

4

2 回答 2

2

尝试取下@Autowired标签。这会寻找构造函数或 setter 方法来填充该字段。考虑到你没有这两个,这可能是问题所在。不过只是猜测。

于 2012-06-26T16:16:51.397 回答
1

或者您可以将 myDao 包保护或公开(以便 Spring 可以实际自动装配它)

例如:

@Autowired
myDao
于 2013-09-26T23:42:14.063 回答