spring-boot - 带有自定义验证的 Spring Boot 测试实体字段验证
问题描述
设置:
- Spring Boot 2.3.3 (spring-boot-starter-validation)
- JUnit 5 木星
- 龙目岛
实体字段可以使用简单的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 不会以某种方式工作。
解决方案
您声明ComplexValueValidator
验证类型的对象Person
:
ComplexValueValidator implements ConstraintValidator<ComplexValueConstraint, Person>
但是注释应用于类型字段String
而不是类型字段Person
:
@ComplexValueConstraint
private String complexValue;
因此,约束不能应用于 a 的消息java.lang.String
。
尝试更改complexValue
为 typePerson
而不是 type String
。
推荐阅读
- r - 在 R 中连接 2 个数据帧
- google-cloud-platform - 用于 pubsub 主题的 setIamPolicy(在资源级别而不是项目)
- wso2 - 重新创建租户时出现 Wso2 问题(创建已删除的租户)。如果我重新启动 wso2 服务器,我可以按预期在 wso2 上创建租户
- java - Volley 库在发布请求时给出错误 500
- pandas - 熊猫数据框中 NaN 和 0 的模棱两可的行为
- ios - SwiftUI - 使用 SwiftUI 创建一条虚线
- ruby-on-rails - Rails 6 `protect_from_forgery with: :null_session` 不起作用
- javascript - 使用 discord bot 将数据传输到 sqlite db
- reactjs - 从地图中获取 React 中的唯一值?
- haskell - 无法将类型“IO”与“[]”匹配