gpt4 book ai didi

java - 访问 Spring WebDataBinder 的 BindingResult 而不放入参数列表

转载 作者:太空宇宙 更新时间:2023-11-04 09:41:26 31 4
gpt4 key购买 nike

我正在尝试将 Spring 验证与 swagger-codegen 生成的 Controller 接口(interface)一起使用。 swagger 代码生成为 Controller 提供了一个抽象类。我们的 Controller 实现 codegen 类并提供实际逻辑。我想在我的 Controller 方法中访问 BindingResult,但 swagger-codegen 不会在其界面中生成该参数。除了将 BindingResults 对象指定为参数之外,还有其他方法可以获取它吗?

为了使这一点更加具体,代码生成器使端点如下所示(删除了嘈杂的代码):

    @RequestMapping(value = "/api/repository/v1/datasets",
produces = { "application/json" },
consumes = { "application/json" },
method = RequestMethod.POST)
default ResponseEntity<JobModel> createDataset(@Valid @RequestBody DatasetRequestModel dataset) {
...
}

我们使用通常的绑定(bind)器设置实现一个 Controller ,例如:

@InitBinder
protected void initBinder(final WebDataBinder binder) {
binder.addValidators(requestValidator)
}

但在端点内,我们无法获取 BindingResult,因为它必须与 codegen 条目的签名匹配:

public ResponseEntity<StudySummaryModel> createStudy(@Valid @RequestBody StudyRequestModel studyRequest) {
...
}

我认为最直接的解决方案可能是跳过使用 WebDataBinder。相反,我可以让每个 Controller 端点直接调用 validator 。

最佳答案

除了手动编码验证之外,我还发现了另一种方法;使用扩展 ResponseEntityExceptionHandler 的 @ControllerAdvice 类。

这里有一个很好的例子:Spring Validation Example

这是我基于该示例的代码,用于格式化错误:

@ControllerAdvice
public class ApiValidationExceptionHandler extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request
) {
BindingResult bindingResult = ex.getBindingResult();

List<String> errorDetails = bindingResult
.getFieldErrors()
.stream()
.map(err -> err.getCode() + " error on '" + err.getObjectName() + "': " + err.getDefaultMessage())
.collect(toList());

ErrorModel errorModel = new ErrorModel()
.message("Validation errors - see error details")
.errorDetail(errorDetails);

return new ResponseEntity<>(errorModel, HttpStatus.BAD_REQUEST);
}
}

关于java - 访问 Spring WebDataBinder 的 BindingResult 而不放入参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55942045/

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