在dto spring boot中验证三个字段中的至少一个

nir*_*air 2 java spring spring-boot

我有一个看起来像这样的DTO:

class VehicleDto {
    private String type;
    private Car car;
    private Bike bike;
}
Run Code Online (Sandbox Code Playgroud)

现在根据类型,我需要验证至少一个汽车和自行车.

两者都不能出现在同一个请求中.

我怎样才能做到这一点?

Ana*_*mov 5

在课堂上有两个领域,而其中只有一个可以出现,对我来说似乎是一种设计气味.但如果你坚持这样的设计 - 你可以为你的班级创建一个自定义的验证器VehicleDto.

public class VehicleValidator implements Validator {

    public boolean supports(Class clazz) {
        return VehicleDto.class.equals(clazz);
    }

    public void validate(Object obj, Errors errors) {

        VehicleDto dto = (VehicleDto) obj;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "type",
                                    "error.message.for.type.field");

        if (null != dto.getType()
              && null != dto.getCar()
              && null != dto.getBike()) {
            switch(dto.getType()) {
                case "car":
                    errors.rejectValue("bike", "error.message.for.bike.field");
                    break;
                case "bike":
                    errors.rejectValue("car", "error.message.for.car.field");
                    break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,请参阅有关验证的Spring文档: