gpt4 book ai didi

java - Spring Jackson反序列化和异常处理

转载 作者:行者123 更新时间:2023-12-02 05:49:40 24 4
gpt4 key购买 nike

我正在 Spring 中构建 REST api,但我的异常处理存在问题。我想验证完整的请求并一次性提供有关有效负载的信息。

假设我的对象是

public class StubJson {
private BigDecimal bigDecimalField;
@NotEmpty
private String stringField;

public void setBigDecimalField(BigDecimal bigDecimalField) { this.bigDecimalField = bigDecimalField; }
public String setStringField(String stringField) { this.stringField = stringField; }
}

我的 Controller 是

@RestController
public class StubController {
@RequestMapping(value = "/stub", method = POST)
public void stub(@Valid @RequestBody StubJson stubJson) {}
}

对此对象的验证位于 @ControllerAdvice 中,它将 FieldError 对象转换为最终用户的翻译错误。

@ResponseStatus(BAD_REQUEST)
@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public List<ErrorJson> processValidationError(MethodArgumentNotValidException ex) {}

如果我传入这个json

{"bigDecimalField": "text", "stringField": ""}

我想要这样的回复

[
{
"field": "stringField",
"message": "Cannot be empty."
},
{
"field": "bigDecimalField",
"message": "Not a number."
}
]

如果我这样做,我会得到一个

com.fasterxml.jackson.databind.exc.InvalidFormatException

在 BigDecimalField 上,仅包含有关仅一个字段的信息。我看到的唯一选择是将其作为字符串传递或编写自定义验证注释。有没有更简单的方法来实现这一目标?

最佳答案

您可以使用 Controller 建议来实现此目的。在您的应用程序中声明 Controller 建议,捕获预期的异常,转换为您所需的响应并返回。请记住 Controller 建议将应用于您的所有 Controller 。

@ControllerAdvice
public class ExceptionHandlerController {

@ExceptionHandler(InvalidFormatException.class)
@ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e ) {

String yourResponse = "";
return yourResponse;
}

}

关于java - Spring Jackson反序列化和异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40860154/

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