我的控制器具有根据 @RequestMapping(produces="", consumes="") 注释生成 JSON 或 HTML 的方法。但是,在以通用方式处理异常时,我遇到了问题。
@RequestMapping(method = POST)
public String add(@Valid MyForm form, BindingResult result, Model model) {
if (result.hasErrors()) {
return "edit";
}
throw new RuntimeException("Error adding");
return "edit";
}
@RequestMapping(method = POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public Map<String, Object> addJSON(@RequestBody @Valid MyForm form, Model model) {
throw new RuntimeException("Error adding");
}
上述两种方法如何写@ExceptionHandler?非 JSON 的那个应该添加一个属性到Model
.
model.addAttribute("error", exception.getMessage());
具有 JSON 响应类型的应该将错误返回为Map
,以便稍后序列化为 JSON。
我尝试了以下方法,但 spring 不喜欢使用相同异常类型声明的两个不同的 @ExceptionHandler 注释方法。
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@RequestMapping(produces = "application/json")
@ResponseBody
public Map<String, Object> handleExceptionAsJSON(RuntimeException exception) {
Map<String, Object> map = new HashMap<>();
map.put("error", exception.getMessage());
return map;
}
@ExceptionHandler(RuntimeException.class)
public Map<String, Object> handleException(RuntimeException exception) {
Map<String, Object> map = new HashMap<>();
map.put("error", exception.getMessage());
return map;
}