Spring版本更改导致RESTful函数中断

时间:2012-08-16 22:30:54

标签: java spring rest

在升级我的应用程序以使用我可用的最新版本的Spring(3.1.1)时,我发现我的一个REST调用会抛出404错误(过去非常成功)。我已经验证切换回旧库(3.0.3)工作,然后返回到新库失败,所有这些都没有改变我的代码。

@Controller
@RequestMapping("/group/{groupId}/template")
public class TemplateController extends AbstractController {
    ...

    @RequestMapping(value="/{templateId}", method=RequestMethod.GET) @ResponseBody
    public Template getTemplate(ServletWebRequest request, 
            @PathVariable("groupId") int groupId, 
            @PathVariable("templateId") int templateId) throws Exception {
        ...
    }

    ...

    @RequestMapping(value="/{templateId}", method=RequestMethod.DELETE) @ResponseBody
    public Task getTemplate(ServletWebRequest request, 
            @PathVariable("groupId") int groupId, 
            @PathVariable("templateId") int templateId) throws Exception {
        ...
    }

    ...
}

我把GET方法放在那里只是为了比较,它有效。但是,当我发出DELETE方法的请求(再次,曾经工作)时,我在日志中收到错误说明:

WARNING: No mapping found for HTTP request with URI [/*appname*/group/1/template/group/1/template/1] in DispatcherServlet with name '*appname*'

现在,错误显然是正确的,我没有任何带有该映射的URI,但为什么它试图找到该映射而不是指定的映射(/*appname*/group/1/template/1)?

2 个答案:

答案 0 :(得分:0)

通过删除@RequestMapping方法的值中的/作为root try映射来处理/。

@RequestMapping(value="{templateId}", method=RequestMethod.DELETE) @ResponseBody
    public Task getTemplate(ServletWebRequest request, 
            @PathVariable("groupId") int groupId, 
            @PathVariable("templateId") int templateId) throws Exception {
        ...
    }

答案 1 :(得分:0)

我仍然不确定为什么我会收到出现的错误,所以我很欣赏Spring的内部工作原理,但我确实弄明白是什么导致了它。与其他方法相比,该方法唯一不同的是它抛出异常,而其他方法却没有。在我注释掉我的ExceptionHandler之后,函数注册正确。

@ExceptionHandler(Exception.class)
public Map<String, String> handleExceptions(Exception e) {
    ...
}

我仍然不知道为什么这会导致错误,但具有讽刺意味的是,这就是我首先升级库的原因:这样异常处理才能正常工作。在我将@ResponseBody添加到函数中之后(我本来打算首先做的),一切正常。