java - 同一数据访问对象的不同验证注释规则
问题描述
如何使用 javax 验证和 Hibernate 验证实现基于某些条件自定义验证注释。
示例代码:
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import org.springframework.stereotype.Component;
import com.kp.mechanic.workshop.validator.beans.GeoLocation;
import com.kp.mechanic.workshop.validator.beans.Practioner;
import com.kp.mechanic.workshop.validator.beans.PractionerAddress;
@Component("validator")
public class ValidatorService {
private Validator validator;
private ValidatorFactory factory;
public void execute() {
System.out.println(" Validation framework starts");
try {
// < DAO call to get GEO Location is AUS >
//Construct Geo Location:
GeoLocation geoLocation= new GeoLocation();
geoLocation.setStrtAddrLine1("walker street ");
geoLocation.setOptionalAddrLine2("bonitoa road");
geoLocation.setZipCD("SY");
factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
Set<ConstraintViolation<Object>> resultSet= validator.validate(geoLocation);
for (ConstraintViolation<Object> object : resultSet) {
System.out.println(object.getPropertyPath() + ": " + object.getMessage());
}
}
catch(Exception e) {
System.out.println("Message "+e);
e.printStackTrace();
}
}
}
使用 Lombok 参考下面给出的 POJO。
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class GeoLocation {
//City name
@NotNull(message="warn:Missing data")
@Size(min =3 , max =50, message = "warn:Invalid length")
@Pattern(regexp = "^a-zA-Z",message = "warn:Invalid characters found in text",flags=Pattern.Flag.CASE_INSENSITIVE)
private String cityNM;
//State Code
@NotNull(message="warn:Missing data")
@Size(min =2 , max =2, message = "warn:Invalid Length")
@Pattern(regexp = "^[a-zA-Z]",message = "warn:Invalid characters found in text",flags=Pattern.Flag.CASE_INSENSITIVE)
private String stateCD;
//zip code
@NotNull(message="warn:Missing data")
@Size(min =5 , max =9, message = "warn:Invalid Length")
@Pattern(regexp = "^[0-9]",message = "warn:Invalid characters found in text")
private String zipCD;
}
使用上面给出的 pom 条目。
对于以下给出的 GEO 位置验证规则为“AUS”,上述代码运行良好。
> CityName : not null , minimum 3 and maximum 50 characters, only alphabets.
> State Code : not null , maximum 2 , only alphabets.
> Zip Code : not null , minimum 5 and maximum 9, only digits.
至于“IND”,我想更改下面给出的验证规则。
> CityName : not null , minimum 10 and maximum 15 characters, only alphabets
> State Code : not null , maximum 6, only alphabets.
> Zip Code : not null , maximum 10, only digits
您能否提出任何建议以根据地理位置类型更改验证规则是 IND?
这是一种自定义注释,有没有更好的方法来重用注释而不在自定义注释类中编写java逻辑? 跨字段的自定义注释
解决方案
我从下面给出的链接中得到了参考。
堆栈溢出 。
编程约束定义
HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class).configure();
ConstraintMapping constraintMapping = configuration.createConstraintMapping();
if(geoLocation.getType().equals("AUS")) {
constraintMapping
.type(GeoLocation.class)
.property("cityName", ElementType.FIELD)
.constraint(new NotNullDef().message("cityName should not empty"))
.constraint(new SizeDef().min(3).message("Minimum 3 charater"))
.constraint(new SizeDef().max(50).message("Maximum 50 character"));
}else if(geoLocation.getType().equals("IND")) {
constraintMapping
.type(GeoLocation.class)
.property("cityName", ElementType.FIELD)
.constraint(new NotNullDef().message("cityName should not empty"))
.constraint(new SizeDef().min(10).message("Minimum 10 charater"))
.constraint(new SizeDef().max(15).message("Maximum 15 character"));
}
validator=configuration.addMapping(constraintMapping).buildValidatorFactory().getValidator();
resultSet= validator.validate(geoLocation);
for (ConstraintViolation<Object> object : resultSet) {
System.out.println(object.getPropertyPath() + ": " + object.getMessage());
}
推荐阅读
- node.js - 反转快递订单路线
- regex - 正则表达式:剪切可选的右侧
- react-native - 如何模拟包含 React Native 本机模块功能的全局变量
- javascript - 如何使用 javascript 函数的输出在 HTML 中显示
- android - Android:跨应用生命周期持久化数据
- javascript - Sweetalert2:完全禁用版本> = 9.0.0的动画的正确方法
- javascript - 使用 selenium.WebDriver 时出现错误:参数列表后丢失)
- flutter - 绘制自定义形状 Flutter
- oauth-2.0 - Quarkus Web 应用程序无法使用 JWT 和 Keycloak 进行授权
- django - 如何在 Django 中显示未读通知计数