Spring MVC和带注释的控制器问题:

我有一个带注释的控制器和Spring MVC的奇怪问题。 我试图使用Annotated控制器为Spring提供的示例MVC应用程序及其文档。 我用了2.5版。

当我在类型级别指定@RequestMapping时,我得到“HTTP错误:500没有适用于处理程序的适配器[控制器类名]:您的处理程序是否实现了像Controller这样的支持接口?

如果我将它包含在方法级别中,它可以解决问题。 向上下文文件添加或删除默认句柄适配器没有区别:

最后,我使用了控制器级别的@RequestMapping,以及方法级别的一个,并且它起作用了。 任何人都知道可能是什么问题?

以下是示例代码:

这不起作用:

@Controller @RequestMapping("/*") public class InventoryController { protected final Log logger = LogFactory.getLog(getClass()); @Autowired private ProductManager productManager; public ModelAndView inventoryHandler() { String now = (new java.util.Date()).toString(); logger.info("returning hello view with " + now); Map myModel = new HashMap(); myModel.put("now", now); myModel.put("products", this.productManager.getProducts()); return new ModelAndView("hello", "model", myModel); } } 

这工作:

 @Controller public class InventoryController { protected final Log logger = LogFactory.getLog(getClass()); @Autowired private ProductManager productManager; @RequestMapping("/hello.htm") public ModelAndView inventoryHandler() { String now = (new java.util.Date()).toString(); logger.info("returning hello view with " + now); Map myModel = new HashMap(); myModel.put("now", now); myModel.put("products", this.productManager.getProducts()); return new ModelAndView("hello", "model", myModel); } } 

这也有效:

 @Controller @RequestMapping("/*") public class InventoryController { protected final Log logger = LogFactory.getLog(getClass()); @Autowired private ProductManager productManager; @RequestMapping( method = RequestMethod.GET, value = "/hello.htm" ) public ModelAndView inventoryHandler() { String now = (new java.util.Date()).toString(); logger.info("returning hello view with " + now); Map myModel = new HashMap(); myModel.put("now", now); myModel.put("products", this.productManager.getProducts()); return new ModelAndView("hello", "model", myModel); } } 

有什么想法,这里发生了什么? 我做了很多搜索,没有解决方案。 我也试过2.5.6,问题类似。

你需要在方法上放置@RequestMapping ,因为将它放在类上是不够的信息 – Spring需要知道调用哪个方法来处理请求。

如果你的class级只有一种方法,那么可以理解你可能认为它会选择它,但事实并非如此。

请注意,带注释的控制器的一个好处是,您可以根据需要在类中包含尽可能多的@RequestMapping注释方法。

您不需要在类上使用@RequestMapping。 这只是一个方便。 您确实需要方法级别@RequestMapping注释。

鉴于这种:

 @Controller public class InventoryController { ... @RequestMapping("/inventory/create/{id}") public void create(...){} @RequestMapping("/inventory/delete/{id}") public void delete(...){} ... 

您可以将URI的库存部分分解出来。

 @Controller @RequestMapping("/inventory") public class InventoryController { ... @RequestMapping("create/{id}") public void create(...){} @RequestMapping("delete/{id}") public void delete(...){} ... 

这是因为第一个配置没有告诉类调用的方法。