feiniaojin / graceful-response

Spring Boot接口响应处理解决方案,提供统一返回值封装、全局异常处理、自定义异常错误码、参数校验增强、断言增强等功能
https://doc.feiniaojin.com
MIT License
1.09k stars 164 forks source link

ValidationStatusCode注解在类属性上时,有概率不生效 #38

Closed xgblack closed 9 months ago

xgblack commented 9 months ago

Describe the bug ValidationStatusCode注解添加在属性上时,有概率不生效。

To Reproduce Steps to reproduce the behavior: 配置文件指定 default-error-code: -1 default-validate-error-code: -2 定义参数对象如下:

@Data
@Accessors(chain = true)
public class StudentAddCmd {
    @ValidationStatusCode
    @NotBlank(message = "姓名不能为空")
    private String name;
    @NotNull
    private Integer age;
    //其他属性...
}

请求接口直接发送{}

Expected behavior 正常情况下,按照代码逻辑应当返回ValidationStatusCode的默认值,即code=1 。但是最连续请求该接口的过程中发现,偶尔出现code=-2 接口为连续请求,中间未重新运行,未重新编译代码。 经过debug发现,List<FieldError> fieldErrors = e.getFieldErrors();获取到的list中的顺序会变,当没有添加注解的属性排在前面的时候,fieldErrors.get(0);无法正确获取添加的注解

Screenshots

image image

Desktop (please complete the following information):

Additional context

feiniaojin commented 9 months ago

您好,建议配一下fail_fast。不配的话,某个属性有ValidationStatusCode,会取ValidationStatusCode的值;对于没有ValidationStatusCode的字段,会取default-validate-error-code: -2

  @Bean
  public Validator validator() {
    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
        .configure()
        .addProperty("hibernate.validator.fail_fast", "true")
        .buildValidatorFactory();
    Validator validator = validatorFactory.getValidator();
    return validator;
  }