同一数据访问对象的不同验证注释规则

问题描述 投票:1回答:1

如何使用带有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提出更改验证规则的任何建议?

这是一种自定义注释,是否有任何更好的方法可以重用注释而无需在自定义注释类中编写Java逻辑?Custom Annotation for cross fields

java hibernate validation lombok spring-annotations
1个回答
0
投票

首先感谢您提出一个很好的问题。

在上述情况下,我将使用基于定制注释的验证器,如下所示。

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设法支持多个国家。

© www.soinside.com 2019 - 2024. All rights reserved.