【发布时间】:2018-05-07 12:25:22
【问题描述】:
我正在使用 javax 和 hibernate 创建我的第一个 Spring Boot Web 应用程序,以验证来自 JSP 表单的数据输入。我有一个包含旅程模型列表的 Booking 模型:
@ValidBooking(groups = {BookingI.class})
public class Booking {
@Min(value = 1, groups = {BookingI.class, Default.class})
private int totalJourneys;
@Valid
private List<Journey> journeys;
// relevant getters and setters
我需要知道如何在提交表单时仅验证旅程项目的选择,现在复杂的地方在于旅程模型包含位置列表:
@ValidJourney
public class Journey {
@Valid
private List<Location> locations;
private List<String> dates;
private List<String> times;
// relevant getters and setters
我可以使用 @Valid 注释成功验证所有预订旅程,但是在提交表单时,我只对某些旅程的成功感兴趣,因此想忽略某些旅程项目约束违规。
到目前为止,我的尝试是使用自定义类验证器来迭代并仅验证所需的旅程,然后使用 buildConstraint ViolationWithTemplate,如下所示:
public class ValidBookingValidator implements ConstraintValidator<ValidBooking, Booking> {
@Override
public boolean isValid(Booking booking, ConstraintValidatorContext constraintValidatorContext) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
int totalJourneys = booking.getTotalJourneys();
int validJourneys = 0;
for (int journeyIdx = 0; journeyIdx < totalJourneys; journeyIdx++) {
Set<ConstraintViolation<Journey>> journeyConstraintViolations = validator.validate(booking.getJourneys().get(journeyIdx));
if (journeyConstraintViolations.isEmpty()) {
validJourneys++;
} else {
for (ConstraintViolation<Journey> violation : journeyConstraintViolations) {
constraintValidatorContext.buildConstraintViolationWithTemplate(violation.getMessage())
.addPropertyNode(violation.getPropertyPath().toString())
.addConstraintViolation();
}
}
}
return totalJourneys == validJourneys;
}
}
上面的代码适用于我的测试,但是当使用 jsp 表单渲染时,spring 数据绑定失败,因为违规约束的属性路径返回为 'locations[0]' 而不是预期的 'booking.journeys[0] .locations[0]'。
是否有人对如何返回完整的属性路径有任何建议,或者对此提供更好的解决方案。
提前致谢。
Java 8, javax validation api 2.0.1, hibernate-validator 6.0.7
【问题讨论】:
标签: java spring-boot hibernate-validator