在升级我的应用程序以使用我可用的最新版本的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
)?
答案 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
添加到函数中之后(我本来打算首先做的),一切正常。