gpt4 book ai didi

java - 使用@ControllerAdvice 和@ResponseStatus 更改响应状态代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:20 25 4
gpt4 key购买 nike

我正在使用 spring mvc,我使用全局异常处理程序来处理异常

@ControllerAdvice
public class GlobalControllerExceptionHandler {

@ResponseStatus(value = HttpStatus.CONFLICT, reason = "Data integrity violation")
@ExceptionHandler({DataIntegrityViolationException.class})
public @ResponseBody AdminResponse handleConflict(DataIntegrityViolationException ex,HttpServletResponse httpServletResponse) {

AdminResponse error = new AdminResponse ();

httpServletResponse.setStatus(HttpStatus.CONFLICT.value());
error.setStatus(Status.FAILURE);
error.setErrorDescription(ex.getMessage());

return error;
}

据我所知,注释 @ResponseStatus(value = HttpStatus.CONFLICT 会将 repose 状态代码更改为 HttpStatus.CONFLICT,但这并没有发生。当我创建虚拟异常并用 @ResponseStatus 注释这个虚拟异常然后抛出这个新异常时,GlobalControllerExceptionHandler 捕获并处理异常并更改响应状态代码。

如何在不创建新异常的情况下更改响应状态代码,我只需要捕获 DataIntegrityViolationException

最佳答案

你采取两种方式。

<强>1。使用@ResponseBody 并返回自定义 JSON 字符串。

@ExceptionHandler(value = { HttpClientErrorException.class, HTTPException.class })
public @ResponseBody String checkHTTPException(HttpServletRequest req, Exception exception,
HttpServletResponse resp) throws JsonProcessingException {

ObjectMapper mapper = new ObjectMapper();
CommonExceptionModel model = new CommonExceptionModel();

model.setMessage("400 Bad Request");
model.setCode(HttpStatus.BAD_REQUEST.toString());

String commonExceptionString = mapper.writeValueAsString(model);

return commonExceptionString;
}

<强>2。使用 ResponseEntity 和异常

返回响应实体。

ResponseEntity.status(exception.getStatusCode()).headers(exception.getResponseHeaders())
.body(exception.getResponseBodyAsString());

关于java - 使用@ControllerAdvice 和@ResponseStatus 更改响应状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46470423/

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