首页 > 解决方案 > 带有自定义验证的 Spring Boot 测试实体字段验证

问题描述

设置:

实体字段可以使用简单的javax.validation约束进行注释,例如@Positive.

@Entity
@Data
@Builder
public class Person {
    @Id
    @GeneratedValue
    private long id;

    @Column
    @Positive(message="not positive")
    private int age;
}

这可以很容易地测试:

public class PersonTest {

    private Validator validator;

    @BeforeEach
    public void before() {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    @Test
    public void invalid_becauseNegativeAge() {
        Person uut = Person.builder().age(-1).build();
        Set<ConstraintViolation<Person>> actual = validator.validate(uut);
        assertThat(actual.iterator().next().getMessage()).isEqualTo("not positive");
    }
}

现在我添加一个自定义验证器Person

@Entity
@Data
@Builder
public class Person {
    @Id
    @GeneratedValue
    private long id;

    @Column
    @Positive(message="not old enough")
    private int age;

    @ComplexValueConstraint
    private String complexValue;
}

自定义注释:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ComplexValueValidator.class)
public @interface ComplexValueConstraint {

    String message() default "too simple";    
    Class<?>[] groups() default {};    
    Class<? extends Payload>[] payload() default {};
}

自定义验证器:

class ComplexValueValidator implements ConstraintValidator<ComplexValueConstraint, Person> {

    @Override
    public boolean isValid(final Person person, final ConstraintValidatorContext context) {
    String complexValue = person.getComplexValue();
    if (complexValue.length() < 5) {
        return false;
    }
    return true;
    }
}

现在,我从上面的测试失败了

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'ComplexValueConstraint' validating type 'java.lang.String'. Check configuration for 'complexValue'

我怎样才能让这个测试再次工作?我知道我可以单独测试验证器,但是我的简单注释(例如@Positive)将保持未经测试。

是因为我在测试类中手动创建了验证器吗?@Autowired 不会以某种方式工作。

标签: spring-bootvalidationentity

解决方案


您声明ComplexValueValidator验证类型的对象Person

ComplexValueValidator implements ConstraintValidator<ComplexValueConstraint, Person>

但是注释应用于类型字段String而不是类型字段Person

@ComplexValueConstraint
private String complexValue;

因此,约束不能应用于 a 的消息java.lang.String

尝试更改complexValue为 typePerson而不是 type String


推荐阅读