【发布时间】:2019-08-14 05:27:19
【问题描述】:
遵守以下代码。 DealerLot 有一个 carInventory,它由汽车组成,所有汽车都包含一个引擎。当前dealerlot 有两辆汽车在库存中,并且在验证时,汽车的一个引擎未能通过验证。但是,错误消息仅包含有关引擎的信息。在消息中包含 carName 的最简洁方式是什么?
public class main {
@Data
@AllArgsConstructor
static class Engine {
@Pattern(regexp="V.*", message="Engine Name must start with a V! You provided ${validatedValue}")
private String engineName;
}
@Data
@AllArgsConstructor
static class Car {
private String carName;
@Valid
private Engine engine;
}
@Data
@AllArgsConstructor
static class DealerLot {
@Valid
private List<Car> carInventory;
}
public static void main(String args[]){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Engine engine1 = new Engine("VQ35DE");
Car car1 = new Car("Nissan 350z", engine1);
Engine engine2 = new Engine("2JZ-GTE");
Car car2 = new Car("Toyota Supra", engine2);
DealerLot dealerLot1 = new DealerLot(Arrays.asList(car1, car2));
Set<ConstraintViolation<DealerLot>> i = validator.validate(dealerLot1);
for (ConstraintViolation<DealerLot> v : i) {
System.out.println(v.getMessage());
};
}}
输出:
Engine Name must start with a V! You provided 2JZ-GTE
我希望输出看起来像下面这样:
Toyota Supra, Engine Name must start with a V! You provided 2JZ-GTE
如果没有这种程度的清晰度,确定哪些汽车存在问题可能会非常混乱。
仅供参考,这些是我在示例中使用的依赖项的版本:
compile group: 'org.hibernate.validator', name: 'hibernate-validator', version: '6.0.17.Final'
compile group: 'org.glassfish', name: 'javax.el', version: '3.0.1-b11'
implementation group: 'org.projectlombok', name: 'lombok', version: "1.18.4"
compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
【问题讨论】:
-
您可能会添加从 Engine dto 到 Car dto 的反向引用,然后在消息中使用表达式语言通过该引用获取名称。不过我还没有尝试过这样的事情。
-
这是一个聚合问题。如果您希望父类 (
Car) 报告其组件之一 (Engine) 的问题,那么您需要将验证移到那里。
标签: java validation hibernate-validator javax.validation