可能标题不是很准确,但是遇到的这个问题确实比较坑。下面来描述一下项目场景:
今天在开发的过程中遇到了两次这种问题:
我的控制层是:
@RestController
@RequestMapping("/front/task")
public class TaskController {
访问其中的一个接口:
@RequestMapping("/taskAction")
public RestResult doTaskAction(@Valid @RequestBody TaskDao taskDao){
RestResult result = new RestResult();
//todo
return result;
}
其中有个传参校验,当传参检验不通过的时候,直接报404:
No mapping found for HTTP request with URI [/front/task/front/task/taskAction] in DispatcherServlet with name 'spring'
很奇怪,springmc多转发了一次。
再检查过springmvc的若干配置,经历了一番周折之后,终于发现了问题所在:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
public RestResult handlerException(HttpServletRequest request, Exception e){
RestResult result = new RestResult();
result.fail(e.getMessage());
System.out.println(e.getMessage());
return result;
}
}
全局异常捕捉类返回的时候没有指定@ResponseBody,springmvc解析不出来RestResult,只好在路径的后面又加上了“/fornt/task”。
正确的写法如下:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public RestResult handlerException(HttpServletRequest request, Exception e){
RestResult result = new RestResult();
result.fail(e.getMessage());
System.out.println(e.getMessage());
return result;
}
}
重启项目,即可解决问题。