gpt4 book ai didi

java - 如何组合验证两个或多个字段?

转载 作者:行者123 更新时间:2023-12-02 00:39:20 27 4
gpt4 key购买 nike

我正在使用 JPA 2.0/Hibernate 验证来验证我的模型。我现在遇到的情况是必须验证两个字段的组合:

public class MyModel {
public Integer getValue1() {
//...
}
public String getValue2() {
//...
}
}

如果 getValue1()getValue2() 均为 null,则该模型无效,否则有效。

如何使用 JPA 2.0/Hibernate 执行此类验证?使用简单的 @NotNull 注释,两个 getter 都必须为非 null 才能通过验证。

最佳答案

对于多个属性验证,您应该使用类级别约束。从 Bean Validation Sneak Peek part II: custom constraints :

Class-level constraints

Some of you have expressed concernsabout the ability to apply aconstraint spanning multipleproperties, or to express constraintwhich depend on several properties.The classical example is addressvalidation. Addresses have intricaterules:

  • a street name is somewhat standard and must certainly have a length limit
  • the zip code structure entirely depends on the country
  • the city can often be correlated to a zipcode and some error checking canbe done (provided that a validationservice is accessible)
  • because of these interdependencies a simple property level constraint doesto fit the bill

The solution offered by the BeanValidation specification is two-fold:

  • it offers the ability to force a set of constraints to be applied before another set of constraints through theuse of groups and group sequences.This subject will be covered in thenext blog entry
  • it allows to define class level constraints

Class level constraints are regularconstraints (annotation /implementation duo) which apply on aclass rather than a property. Saiddifferently, class-level constraintsreceive the object instance (ratherthan the property value) in isValid.

@AddressAnnotation 
public class Address {
@NotNull @Max(50) private String street1;
@Max(50) private String street2;
@Max(10) @NotNull private String zipCode;
@Max(20) @NotNull String city;
@NotNull private Country country;

...
}

@Constraint(validatedBy = MultiCountryAddressValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AddressAnnotation {
String message() default "{error.address}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}

public class MultiCountryAddressValidator implements ConstraintValidator<AddressAnnotation, Address> {
public void initialize(AddressAnnotation constraintAnnotation) {
// initialize the zipcode/city/country correlation service
}

/**
* Validate zipcode and city depending on the country
*/
public boolean isValid(Address object, ConstraintValidatorContext context) {
if (!(object instanceof Address)) {
throw new IllegalArgumentException("@AddressAnnotation only applies to Address objects");
}
Address address = (Address) object;
Country country = address.getCountry();
if (country.getISO2() == "FR") {
// check address.getZipCode() structure for France (5 numbers)
// check zipcode and city correlation (calling an external service?)
return isValid;
} else if (country.getISO2() == "GR") {
// check address.getZipCode() structure for Greece
// no zipcode / city correlation available at the moment
return isValid;
}
// ...
}
}

The advanced address validation ruleshave been left out of the addressobject and implemented byMultiCountryAddressValidator. Byaccessing the object instance, classlevel constraints have a lot offlexibility and can validate multiplecorrelated properties. Note thatordering is left out of the equationhere, we will come back to it in thenext post.

The expert group has discussed variousmultiple properties supportapproaches: we think the class levelconstraint approach provides bothenough simplicity and flexibilitycompared to other property levelapproaches involving dependencies.Your feedback is welcome.

关于java - 如何组合验证两个或多个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57955131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com