【问题标题】:Spring MVC 3.1.0 bug? After upgrade controllers are no more autodetectedSpring MVC 3.1.0 错误?升级后不再自动检测控制器
【发布时间】:2012-01-29 21:07:13
【问题描述】:

我正在编写使用 Spring MVC 将 Spring bean 与类似 REST 的通道绑定的 Web 应用程序。

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

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

这是这个 Spring 版本中的一个错误,还是我正在使用已弃用的配置,而新版本不再支持该配置?我没有收到任何错误或警告,只是没有自动检测到 bean。

控制器接口定义如下:

@RequestMapping("/config") public interface ConfigChannel

以及实现:

@Controller
public class ConfigChannelImpl implements ConfigChannel

【问题讨论】:

  • 能不能给个Controller的代码
  • @JigarJoshi 添加了接口和实现的声明
  • 我建议首先将日志记录级别设置为 DEBUG,看看这是否能给你一些关于正在发生的事情的线索。
  • 你知道问题是没有创建 bean,还是 mvc:annotation-driven 无法获取你的请求映射?

标签: java spring spring-mvc spring-annotations autowired


【解决方案1】:

Spring 文档指出基于接口的@Controllers 用于代理事务方法。因此,您可能正在使用<tx:annotation-driven /> 标签。您现在似乎遇到的问题是 Spring 3.1 引入了对 CGLIB 的支持,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

【讨论】:

  • 我不需要类级别的代理,我过去遇到过问题,所以我现在总是使用接口进行代理。我只需要检测到这个接口实现并将其连接到 Spring MVC 引擎。
  • 不过,需求仍然存在。 CGLIB 是 Spring 3.1 在运行时管理这种关系的方式。
  • 是的,您的解决方案对我有用。我不得不添加 spring-tx 模式和 tx:annotation-driver,尽管我没有在这种情况下使用它。在简单地添加 cglib bean 后被检测到并放入 spring 上下文,但没有添加到 MVC servlet。现在它可以工作了,我希望代理定位类级别不会有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多