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

时间:2009-12-29 14:42:47

标签: java spring spring-mvc

我遇到了带注释的控制器和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,问题类似。

3 个答案:

答案 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)

这是因为第一个配置不会告诉该类的哪个方法调用。