首页 > 解决方案 > 同一数据访问对象的不同验证注释规则

问题描述

如何使用 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逻辑? 跨字段的自定义注释

标签: javahibernatevalidationlombokspring-annotations

解决方案


我从下面给出的链接中得到了参考。
堆栈溢出 。
编程约束定义

 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());
           }

推荐阅读