gpt4 book ai didi

java - 无法在异常处理程序中捕获 JsonMappingException

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:10 26 4
gpt4 key购买 nike

我有一个用 Java (spring boot) 编写的 rest api,我的请求从请求 header 中获取一个 json 字符串(不要问为什么这样:),例如{flowerId: 123}在我的 Controller 中,我将字符串映射到对象。所以当用户传入垃圾数据时,例如{flowerId: abc},将抛出 JsonMappingException。我想在我的异常处理程序中处理异常,但无法在我的处理程序中捕获它。我错过了什么?谢谢

请参阅下面的代码。

   @RestController
public class FlowerController {
@GetMapping
@ResponseStatus(HttpStatus.OK)
public GetFlowerResponse getFlowers(@RequestHeader(name = Constants.myHeader) String flowerIdString) throws IOException {
GetFlowerRequest getFlowerRequest = new ObjectMapper().readValue(flowerIdString, GetFlowerRequest.class);
//get Flower info with request ...
}
}


@RestControllerAdvice
public class ApplicationExceptionHandler {
@ExceptionHandler(value = {JsonMappingException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public GetFlowerResponse processServletRequestBindingException(HttpServletRequest req, ServletRequestBindingException e) {
return buildExceptionResponse(e, ErrorMessages.INVALID_REQUEST.getCode(), e.getMessage());
}

@ExceptionHandler(value = Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public GetFlowerResponse processUnhandledExceptions(HttpServletRequest req, Exception e) {
return buildExceptionResponse(e, ErrorMessages.SERVICE_UNAVAILABLE.getCode(), ErrorMessages.SERVICE_UNAVAILABLE.getDescription());
}
}

public class GetFlowerRequest {
int flowerId;
}

public class GetFlowerResponse {
private List<ReturnDetail> returnDetails;
}

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ReturnDetail {
@Builder.Default
private Integer code = 0;

@Builder.Default
private String message = "";

private String source;

最佳答案

您的异常处理程序无效。您的方法 processServletRequestBindingException()ServletRequestBindingException 异常声明为参数,但注释为 @ExceptionHandler(value = {JsonMappingException.class})。这个异常类型必须是兼容的,否则它不会工作,你会在异常处理时得到一个异常。

new ObjectMapper().readValue() 抛出 JsonParseExceptionJsonMappingException。两者都扩展了 JsonProcessingException,因此您很可能需要针对此异常的处理程序来涵盖这两种情况:

@ExceptionHandler(JsonProcessingException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public GetFlowerResponse handleJsonProcessingException(
HttpServletRequest req, JsonProcessingException ex) {
...
}

请注意,最好从 Spring 上下文 Autowiring ObjectMapper 并且不要创建新实例。

关于java - 无法在异常处理程序中捕获 JsonMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53661145/

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