Spring Boot之Validation自定义实现总结

Spring Boot Validation定制

虽然在Spring Boot中已经提供了非常多的预置注解,用以解决在日常开发工作中的各类内容,但是在特定情况仍然存在某些场景,无法满足需求,需要自行定义相关的validator。本节将针对自定义的validator进行介绍。

自定义的注解

这里的场景设置为进行IP地址的验证,通过注解的方式,让用户使用验证规则。注解定义如下:

@Target({ElementType.FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = IPAddressValidator.class)
public @interface IPAddress {
    String message() default "{ipaddress.invalid}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

这个注解是作用在Field字段上,运行时生效,触发的是IPAddressValidator这个验证类。

  • message
    定制化的提示信息,主要是从ValidationMessages.properties里提取,也可以依据实际情况进行定制
  • groups
    这里主要进行将validator进行分类,不同的类group中会执行不同的validator操作
  • payload
    主要是针对bean的,使用不多。
    然后自定义Validator,这个是真正进行验证的逻辑代码:
public class IPAddressValidator implements ConstraintValidator<IPAddress, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        Pattern pattern = compile("^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$");
        Matcher matcher = pattern.matcher(value);
        try {
            if (!matcher.matches()) {
                return false;
            } else {
                for (int i = 1; i <= 4; i++) {
                    int octet = Integer.valueOf(matcher.group(i));
                    if (octet > 255) {
                        return false;
                    }
                }
                return true;
            }
        } catch (Exception e) {
            return false;
        }
    }
}

关于IP地址的验证规则是通用的,具体逻辑不用太在意,主要是需要这里Validator这个接口,以及其中的两个泛型参数,第一个为注解名称,第二个为实际字段的数据类型。

使用自定义的注解

定义了实体类CustomFieldBean.java

@Data
public class CustomFieldBean {
    @IPAddress
    private String ipAddr;
}

使用方法非常简约,基于注解,无侵入逻辑。

单元测试用例

测试代码:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CustomFieldValidatorTest {
    @Autowired
    private ProductService productService;

    @Test(expected = ConstraintViolationException.class)
    public void testInvalid() {
        CustomFieldBean customFieldBean = new CustomFieldBean();
        customFieldBean.setIpAddr("1.2.33");

        this.productService.doCustomField(customFieldBean);
    }

    @Test
    public void testValid() {
        CustomFieldBean customFieldBean = new CustomFieldBean();
        customFieldBean.setIpAddr("1.2.33.123");

        this.productService.doCustomField(customFieldBean);
    }
}

自定义执行Validator

如果不希望由系统自行触发Validator的验证逻辑,则可以由开发者自行进行验证。在Spring Boot已经内置了Validator实例,直接将其加载进来即可。
使用示例如下:

@Autowired
private Validator validator;

自定义执行的单元测试

测试代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CodeValidationTest {
    @Autowired
    private Validator validator;

    @Test(expected = ConstraintViolationException.class)
    public void testValidator() {
        CustomFieldBean input = new CustomFieldBean();
        input.setIpAddr("123.3.1");
        Set<ConstraintViolation<CustomFieldBean>> violations = validator.validate(input);
        if (!violations.isEmpty()) {
            throw new ConstraintViolationException(violations);
        }
    }
}

总结

关于Validation的相关用法,一共写了4篇,希望能够对大家有用。

发布了478 篇原创文章 · 获赞 804 · 访问量 433万+

猜你喜欢

转载自blog.csdn.net/blueheart20/article/details/88817334
今日推荐