我遇到了带注释的控制器和Spring MVC的奇怪问题。我试图使用Annotated控制器为Spring提供的示例MVC应用程序及其文档。我使用的是2.5版本。
当我在类型级别指定@RequestMapping时,我得到“HTTP ERROR: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<String, Object> myModel = new HashMap<String, Object>();
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<String, Object> myModel = new HashMap<String, Object>();
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<String, Object> myModel = new HashMap<String, Object>();
myModel.put("now", now);
myModel.put("products", this.productManager.getProducts());
return new ModelAndView("hello", "model", myModel);
}
}
任何想法,这里发生了什么?我做了很多搜索而没有解决方案。我也试过2.5.6,问题类似。
答案 0 :(得分:7)
您需要在方法上放置@RequestMapping
,因为将它放在类上的信息不够 - Spring需要知道调用哪个方法来处理请求。
如果你的班级只有一种方法,那么你可能会认为它会选择那种方法,但事实并非如此。
请注意,带注释的控制器的一个好处是,您可以根据需要在类中添加尽可能多的@RequestMapping
个带注释的方法。
答案 1 :(得分:3)
您不需要在课程上使用@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(...){}
...
答案 2 :(得分:1)
这是因为第一个配置不会告诉该类的哪个方法调用。