【问题标题】:Using @ExceptionHandler to serve JSON or HTML response based on @RequestMapping使用 @ExceptionHandler 基于 @RequestMapping 提供 JSON 或 HTML 响应
【发布时间】:2012-11-08 13:59:10
【问题描述】:

我的控制器具有根据 @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;
}

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

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

    我不确定你在做什么。但我想写你自己的exceptionresolver 会解决你的问题。我已经这样做了。我创建了自己的 exceptionresolver,它只用于 Ajax 请求,然后将它与现有的 ExceptionHandlerExceptionResolver 链接起来。

    【讨论】:

    • "ExceptionHandler 被映射到 throwable 参数。因此,在你的情况下,只有 1 个异常处理程序被尊重。" - 这不是真的!
    • 我修改了上面的第一行。如果您不相信我,请查看ExceptionHandlerMethodResolver第 71 行(detectExceptionMappings 方法)。顺便说一句,Spring 3.2.x 是我的参考。
    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2018-11-07
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多