如何使用带有Hibernate验证实现的javax验证如何基于某些条件来自定义验证注释。
示例代码:
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提出更改验证规则的任何建议?
首先感谢您提出一个很好的问题。
在上述情况下,我将使用基于定制注释的验证器,如下所示。
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
}
}
}
您需要在任何要查找的字段上注释@StateValidate
这将是更具控制性的方法,如果需要,可以使用i18设法支持多个国家。