Java 同一数据访问对象的不同验证注释规则
如何使用javax验证和Hibernate验证实现根据某些标准定制验证注释 示例代码:Java 同一数据访问对象的不同验证注释规则,java,hibernate,validation,lombok,spring-annotations,Java,Hibernate,Validation,Lombok,Spring Annotations,如何使用javax验证和Hibernate验证实现根据某些标准定制验证注释 示例代码: import javax.validation.Validator; import javax.validation.ValidatorFactory; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import org.springframew
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();
}
}
}
使用上述pom条目
上述代码适用于以下给定的地理位置验证规则“AUS”
对于“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逻辑?
首先,感谢您提出一个好问题 在上面的场景中,我将使用自定义的基于注释的验证器,如下所示
package com.example.demo;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.FIELD;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = StateCodeValidator.class)
@Documented
@Target({METHOD, FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface StateValidate {
String message() default "Invalid State";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
package com.example.demo;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
public class StateValidator implements ConstraintValidator<StateValidate, String>{
@Autowired
private HttpServletRequest httpServletRequest;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//TODO you can check code size as per requirement
}
}
}
package com.example.demo;
导入静态java.lang.annotation.ElementType.METHOD;
导入静态java.lang.annotation.ElementType.FIELD;
导入java.lang.annotation.Documented;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
导入java.lang.annotation.Target;
导入javax.validation.Constraint;
导入javax.validation.Payload;
@约束(validatedBy=StateCodeValidator.class)
@记录
@目标({方法,字段})
@保留(RetentionPolicy.RUNTIME)
public@interface StateValidate{
字符串消息()默认为“无效状态”;
类[]组()默认值{};
类我从下面的链接中获得了参考。
HibernateValidatorConfiguration=Validation.byProvider(HibernateValidator.class).configure();
ConstraintMapping ConstraintMapping=configuration.createConstraintMapping();
if(geoLocation.getType().equals(“AUS”)){
约束映射
.type(GeoLocation.class)
.property(“cityName”,ElementType.FIELD)
.constraint(新的NotNullDef().message(“cityName不应为空”))
.constraint(新的SizeDef().min(3).message(“最小3个字符”))
.constraint(新的sizedf().max(50).message(“最多50个字符”);
}else if(geoLocation.getType().equals(“IND”)){
约束映射
.type(GeoLocation.class)
.property(“cityName”,ElementType.FIELD)
.constraint(新的NotNullDef().message(“cityName不应为空”))
.constraint(新的SizeDef().min(10).message(“最小10个字符”))
.constraint(新的SizeDef().max(15).message(“最多15个字符”);
}
validator=configuration.addMapping(constraintMapping).buildValidatorFactory().getValidator();
resultSet=validator.validate(地理位置);
for(ConstraintViolation对象:resultSet){
System.out.println(object.getPropertyPath()+”:“+object.getMessage());
}
您所指的地理位置值是AUS
。但是,它指的是哪个字段?有城市、州和邮政域。地理位置是POJO,我过去常常从DAO层获取POJO列表。从Geo中选择*类型为='AUS',工作正常。我想从Geo中对IND ie select*进行不同类型的验证其中type='IND'相同类型的POJO和不同类型的验证规则same type of POJO和不同类型的验证规则ses POJO可以是相同的…这些是您在条件上创建的不同验证规则这是一种带有跨字段的自定义验证,也许我必须编写相同类型的验证规则,还有其他吗这是一种重用基于参数的注释的方法。您可以使用泛型对其进行增强,我将是一个很好的实验
> 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
package com.example.demo;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.FIELD;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = StateCodeValidator.class)
@Documented
@Target({METHOD, FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface StateValidate {
String message() default "Invalid State";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
package com.example.demo;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
public class StateValidator implements ConstraintValidator<StateValidate, String>{
@Autowired
private HttpServletRequest httpServletRequest;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//TODO you can check code size as per requirement
}
}
}
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());
}