1. 程式人生 > 其它 >pure-validation可配置、無侵入、易拓展、熱載入、輕量級動態引數驗證框架(java)

pure-validation可配置、無侵入、易拓展、熱載入、輕量級動態引數驗證框架(java)

pure-validation一款可配置、無侵入、易拓展、熱載入、輕量級的動態引數驗證框架,可替代hibernate-validation,程式碼總數不足1000行,簡單易學,也可以自行拓展實現更多驗證器validator,有需要star一下。

github: https://github.com/purestackorg/pure-validation

預設包含多個通用驗證實現

<?xml version="1.0" encoding="UTF-8"?>
<validators>
	<validator name="required" class="com.purestack.common.validation.validators.RequiredValidator"/>
	<validator name="pattern" class="com.purestack.common.validation.validators.PatternValidator"/>
	<validator name="size" class="com.purestack.common.validation.validators.SizeValidator"/>
	<validator name="min" class="com.purestack.common.validation.validators.MinValidator"/>
	<validator name="max" class="com.purestack.common.validation.validators.MaxValidator"/>
	<validator name="equals" class="com.purestack.common.validation.validators.EqualsValidator"/>
	<validator name="timestampMax" class="com.purestack.common.validation.validators.TimestampMaxValidator"/>
	<validator name="timestampMin" class="com.purestack.common.validation.validators.TimestampMinValidator"/>
	<validator name="decimalMax"  class="com.purestack.common.validation.validators.DecimalMaxValidator"/>
	<validator name="decimalMin"  class="com.purestack.common.validation.validators.DecimalMinValidator"/>
	<validator name="spring"  useSpring="true" class="com.purestack.common.validation.validators.SpringValidator"/>
</validators>
  1. 定義全域性規則配置,引入各個實體驗證規則
<?xml version="1.0" encoding="UTF-8"?>
<validation>
	<!-- include 標籤匯入其他配置 -->
	<include file="validation/user.rule.xml"/>
	<include file="validation/article.rule.xml"/>
</validation>
  1. 定義user和article實體驗證規則

user.rule.xml規則

<?xml version="1.0" encoding="UTF-8"?>
<validation>
	<!-- 驗證組ID,全域性唯一 -->
	<group name="user.rule">
		<!-- 驗證欄位 -->
		<field name="email">
			<rule name="required" message="郵件必須填寫"/>
			<rule name="size" message="郵件長度應該3-100之間">
				<param name="min" value="3"/>
				<param name="max" value="100"/>
			</rule>
			<rule name="pattern" message="郵件格式不正確">
				<param name="regex" value="^[A-Za-z]+[\.\-_A-Za-z0-9]*@[A-Za-z0-9]+[\.\-_A-Za-z0-9]*$"/>
			</rule>
		</field>
		<field name="password">
			<rule name="required" message="密碼必須填寫" />
			<rule name="min" message="密碼至少8個字元">
				<param name="value" value="9" />
			</rule>
			<rule name="max" message="密碼最多20個字元">
				<param name="value" value="20" />
			</rule>
			<rule name="equals" message="兩次密碼輸入不正確">
				<param name="target" value="passwordOne" />
			</rule>
		</field>
		<field name="starttime">
			<rule name="timestampMax" message="開始時間不能大於結束時間">
				<param name="target" value="endtime" />
			</rule>
		</field>
		<field name="endtime">
			<rule name="timestampMin" message="結束時間不能小於開始時間">
				<param name="target" value="starttime" />
			</rule>
		</field>
		<field name="age">
			<rule name="decimalMin" message="年齡要大於30歲">
				<param name="value" value="30" />
			</rule>
			<rule name="decimalMax" message="年齡要小於或等於50歲">
				<param name="inclusive" value="true" />
				<param name="value" value="50" />
			</rule>
		</field>
		<field name="address">
			<rule name="required" message="地址必須填寫" />
		</field>
		<field name="postcode">
			<rule name="equals" message="郵編必須為440000">
				<param name="value" value="440000" />
			</rule>
		</field>
		<field name="stars">
			<rule name="decimalMin" message="星星數量要大於5">
				<param name="value" value="5" />
			</rule>
		</field>
	</group>
</validation>

article.rule.xml規則
```xml
<?xml version="1.0" encoding="UTF-8"?>
<validation>
	<!-- 驗證組ID,全域性唯一 -->
	<group name="article.rule">
		<!-- 驗證欄位 -->
		<field name="text">
			<!-- 規則列表 -->
			<rule name="required" message="內容必須填寫" />
			<rule name="between" message="長度應該100-10000之間">
				<param name="min" value="100" />
				<param name="max" value="10000" />
			</rule>
		</field>
	</group>
</validation>
  1. 定義測試實體類

import java.sql.Timestamp;

/**
 * 使用者物件
 *
 */
public class User {
    // 使用者名稱
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    // 密碼
    private String password;
    // 確認密碼
    private String passwordOne;

    // 郵箱
    private String email;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPostcode() {
        return postcode;
    }

    public void setPostcode(String postcode) {
        this.postcode = postcode;
    }

    public Double getStars() {
        return stars;
    }

    public void setStars(Double stars) {
        this.stars = stars;
    }

    private String address;
    private String postcode;
    private Double stars;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    private Integer age;

    private Timestamp starttime;
    private Timestamp endtime;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPasswordOne() {
        return passwordOne;
    }

    public void setPasswordOne(String passwordOne) {
        this.passwordOne = passwordOne;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Timestamp getStarttime() {
        return starttime;
    }

    public void setStarttime(Timestamp starttime) {
        this.starttime = starttime;
    }

    public Timestamp getEndtime() {
        return endtime;
    }

    public void setEndtime(Timestamp endtime) {
        this.endtime = endtime;
    }
}
  1. 定義單元測試方法,檢視效果

import com.purestack.common.validation.BasicValidateService;
import com.purestack.common.validation.IValidateService;
import com.purestack.common.validation.ValidationResult;
import com.purestack.common.validation.config.BasicValidateConfig;
import com.purestack.common.validation.config.IValidateConfig;
import org.junit.jupiter.api.Test;
import java.sql.Timestamp;
import java.util.Calendar;

import org.apache.log4j.Logger;

public class ValidationTest {

    private static Logger logger = Logger.getLogger(ValidationTest.class);
    @Test
    public void testValid() {

        // 驗證器配置,系統預設配置
        String validatorsXML = "validation/validators.xml";

        // 規則配置
        String rulesXML = "validation/rules.xml";

        /**
         * 例項化配置物件
         */
        IValidateConfig config =new BasicValidateConfig(validatorsXML, rulesXML);
        /**
         * 例項化驗證服務層
         */
        IValidateService validateService = new BasicValidateService(config);

        // 例項化使用者
        User user = createUser();

        /**
         * 執行驗證
         */
        ValidationResult result = validateService.validate(user, "user.rule");
        // 輸出結果
        if(result.isValid()) {

            logger.info("驗證成功.");
        } else {
            logger.info("驗證失敗,結果如下");
            logger.info(result.getErrors());

        }
    }

    public User createUser(){
        User user = new User();

        user.setEmail("test#purestack.cc");

        user.setPassword("123");
        user.setPasswordOne("abc");
        user.setAge(70);
        user.setPostcode("4422222");

        Calendar date = Calendar.getInstance();

        user.setStarttime(new Timestamp(date.getTimeInMillis()));
        user.setEndtime(new Timestamp(date.getTimeInMillis()-1000));
        return user;

    }
}

簡單的4個步驟即可完成動態配置驗證規則,簡單方便,你值得擁有!