2011-12-29 27 views
2

我正在编写Web应用程序,它使用Spring MVC将Spring bean与类似REST的通道绑定。Spring MVC 3.1.0错误?升级后控制器不再被自动检测

我已经在我以前的应用程序(纯XML配置)和示例中创建了基本配置,其中使用了<mvc:annotation-driven/>功能。我在spring xml文件中指向一个包含<context:component-scan base-package="my.package"/>控制器的包。

它正在工作 - 在春季3.0.6.RELEASE。但是,升级到3.1.0.RELEASE我的控制器停止检测,并且没有注册通道。 Spring上下文不包含实现的接口。

这是一个在这个春天版本中的错误,或者我使用的是不推荐使用的配置,在新版本中停止使用它?我没有错误或警告,只是没有自动检测到bean。

控制器接口定义看起来像这样:

@RequestMapping("/config") public interface ConfigChannel 

和实现:

@Controller 
public class ConfigChannelImpl implements ConfigChannel 
+0

你可以请出示控制器 – 2011-12-29 12:48:30

+0

@JigarJoshi的代码添加接口并实现了一套 – 2011-12-29 12:57:24

+0

的声明你知道,如果这个问题是不是正在创建的豆,或者是否MVC:注释驱动程序未能提取您的请求映射? – waxwing 2011-12-29 13:04:23

回答

2

Spring文档表明,基于接口的@Controller s为用于代理事务方法。因此,您可能正在使用<tx:annotation-driven />标签。你现在看到的问题是Spring 3.1引入了对基于运行时字节码操作符CGLIB的支持。您需要将proxy-target-class="true"添加到您的事务配置中,并将CGLIB添加到您的类路径中。

<tx:annotation-driven proxy-target-class="true" /> 

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping

+0

我不需要在课堂上使用代理,我在过去遇到过问题,所以我现在总是使用接口进行代理。我只需要检测此接口实现并将其连接到Spring MVC引擎。 – 2011-12-29 15:09:08

+0

不过,这个要求仍然存在。 CGLIB是Spring 3.1在运行时如何管理这种关系。 – 2011-12-29 15:11:16

+0

是的,您的解决方案已为我工作。我不得不添加spring-tx模式和tx:注释驱动程序,尽管我不在此上下文中使用它。在简单添加检测到的cglib bean后,将其放入spring上下文中,但未添加到MVC servlet中。现在,它的工作原理,我希望我不会有代理目标级别的任何问题。 – 2011-12-30 10:56:25