使用@ExceptionHandler基于@RequestMapping提供JSON或HTML响应

时间:2012-11-08 13:59:10

标签: java spring-mvc

我的控制器具有根据其@RequestMapping(produce =“”,consume =“”)注释生成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;
}

1 个答案:

答案 0 :(得分:0)

您的ExceptionHandler都有RuntimeException个参数。因此,在您的情况下,只有1 exceptionhandler被尊重。

我不确定你在做什么。但我想编写自己的exceptionresolver可以解决您的问题。我已经这样做了。我创建了自己的exceptionresolver专用于Ajax请求,然后用现有的ExceptionHandlerExceptionResolver链接它。