springBoot + hibernate-validator 验证问题

public class ScanRegisterBean implements Serializable{

    @Min(value = 1)
    @Max(value = Long.MAX_VALUE)
    private long id;

    @NotBlank(groups = {ScanRegister.class, Register.class})
    @Length(min = 2, max = 20,groups = {ScanRegister.class, Register.class})
    private String nick;

    @NotBlank(groups = {ScanRegister.class, Register.class})
    @Phone(mode = 0,groups = {ScanRegister.class, Register.class})
    private String phone;

    @NotBlank(groups = {ScanRegister.class, Register.class})
    @Length(min = 6, max = 20,groups = {ScanRegister.class, Register.class})
    private String pwd;

    @NotBlank(groups = {Register.class})
    private String deviceId;

    public interface ScanRegister {}

    public interface Register{}
}

hibernate-validator 配置的是 快速失败,配置如下

@Configuration
public class HibernateConfig {

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

有个问题就是,在校验的时候不能先把一个字段校验完毕,在校验下一个字段。
比如:
前端提交的时候,
nick, phone, pwd 都不填的时候, 会提示用户 nick 不能为空。然后再给nick赋值为 哈 的时候,再次提交,不会校验nick 的长度, 而是直接校验 phone,看phone是不是为空。怎么让hibernate 继续校验 nick 的长度,而不是直接校验Phone 是不是为空?

阅读 3.8k
2 个回答

个人意见: 你说的那种累积性校验建议在前端做, 提交时高亮显示填充不完整/出错的. 而后端校验原则应该是尽早失败, 出错尽早返回, 而不是等第二个第三个错, 在后端做这个没有太大意义, 且性能体验不如在前端完成高效.

“哈”占两个字节长度啊,你min为2刚好通过啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题