如何在 Spring Boot REST API 中返回多个字段验证违规(`jakarta.validation.constraints`)?

问题描述 投票:0回答:1

上下文:

我的 Spring Boot 后端应用程序中有一个 REST API。此 REST API 具有带有请求正文的HTTP POST 端点。此请求正文作为java DTO 类包含多个字段(属性)。我向这些字段添加了

jakarta.validation.constraints
注释,例如
@NotNull
@NotEmpty
和其他注释以验证输入数据。

现在:

如果这些字段中的任何一个违反了这些

jakarta.validation.constraints
注释约束,它会立即抛出一个异常,当然我用
ExceptionHandler class
捕获它,它返回HTTP 400 Bad Request并带有正确的错误消息。问题是,使用这种方法,我无法向用户提供所有字段验证违规,让用户完全了解哪些字段输入不正确,哪些字段输入正确,因为在验证第一个错误输入后会抛出异常。

我需要:

我需要有机会向用户发送一条包含所有字段验证违规的错误消息。


我的应用程序有:

  • org.springframework启动3.2.5版本

  • java 17

java spring spring-boot rest http
1个回答
0
投票

您可以使用 org.springframework.validation.Validator 实例手动验证对象并获取所有错误。这是一个例子:

@Slf4j
@Component
public class ValidateServiceImpl implements ValidateService {

private Validator validator;

@Autowired
public ValidateServiceImpl(@Qualifier("defaultValidator")Validator validator) { // 1
    this.validator = validator;
}

@Override
public boolean isValid(Object bean, String objectName) {
    BeanPropertyBindingResult validateResult = new BeanPropertyBindingResult(bean, objectName); // 2
    validator.validate(bean, validateResult); // 3
    boolean isValid = !validateResult.hasErrors(); // 4
    if(!isValid && log.isDebugEnabled()){
        log.debug("{} is not valid. ObjectName: {} Errors:{}", bean, objectName, validateResult.getAllErrors()); // 5
    }
    return isValid;
}}
  1. 首先,注入Spring Boot创建的默认验证器;
  2. 声明一个BeanPropertyBindingResult来保存验证结果;
  3. 验证对象;
  4. 检查是否有错误;
  5. 如果有,则从validateResult中获取所有错误;
© www.soinside.com 2019 - 2024. All rights reserved.