gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:34 24 4
gpt4 key购买 nike

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

最佳答案

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

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

关于java - 使用@ExceptionHandler 提供基于@RequestMapping 的JSON 或HTML 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com