【发布时间】:2020-10-19 09:13:18
【问题描述】:
我目前正在为服务中的 bean 验证编写一些 @SpringBootTest。
@Data
@Document
public final class Supplier {
@Id
@NotEmpty
private String supplierId;
...
@NotEmpty
private String hash;
....
}
测试
注释:
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.MOCK)
和
@Test
void testValidation() {
Supplier invalidSupplier = SupplierTestDataUtil.createSupplier("1234");
invalidSupplier.setSupplierId(null);
//works
assertThrows(ConstraintViolationException.class, () -> supplierService.publish(invalidSupplier));
//works
assertThrows(ConstraintViolationException.class, () -> supplierService.persist(invalidSupplier));
//works not
assertThrows(ConstraintViolationException.class, () -> supplierService.saveAndPublish(invalidSupplier));
//works
assertThrows(ConstraintViolationException.class, () -> supplierService.delete(invalidSupplier));
}
服务:
@Transactional
public Supplier saveAndPublish(@NotNull Supplier supplier) {
supplier.setHash(messageDigester.digest(supplier));
Supplier persisted = persist(supplier);
publish(supplier);
return persisted;
}
@Transactional
public Supplier persist(@Valid @NotNull Supplier supplier) {
return repository.save(supplier);
}
此时 saveAndFlush 的供应商必须无效,因为将在该方法中生成并设置所需的哈希值。 尽管如此,我的期望是 ConstraintViolationException 也会被抛出,因为我还调用了 persist 和 publish 方法并传递了该无效文档。
我的意思是你可以在同一个类中绕过 BeanValidation。
【问题讨论】:
标签: java spring spring-boot bean-validation