亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javax.validation結合spring的示例分析

發布時間:2021-07-31 14:07:14 來源:億速云 閱讀:184 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“javax.validation結合spring的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“javax.validation結合spring的示例分析”這篇文章吧。

JSR303 是一套JavaBean參數校驗的標準,它定義了很多常用的校驗注解,我們可以直接將這些注解加在我們JavaBean的屬性上面,就可以在需要校驗的時候進行校驗了。

注解如下:

javax.validation結合spring的示例分析

Hibernate validator 在JSR303的基礎上對校驗注解進行了擴展,擴展注解如下:

javax.validation結合spring的示例分析

pom中添加注解

<!--jsr 303-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <!-- hibernate validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.0.Final</version>
        </dependency>

Spring配置

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

自己的Violation實體

這里使用的Lombok獲取get和set,使用的@Getter注解

@AllArgsConstructor 這個注解是lombok中為類提供一個全參的構造方法

package com.alibaba.xianzhi.validator;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * Created by Jackielee on 2017
 * @author: lizhilong
 * @date:   2017-11-14 18:01:34   
 */
@Getter
@AllArgsConstructor
public class Violation implements Serializable {
    private static final long serialVersionUID = -1731546219600067986L;
    private final String message;
    private final Object bean;
    private final String property;
    private final Object value;
}

封裝一個ViolationBuild

后面會說這個類的用法

package com.alibaba.xianzhi.validator;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.collections.CollectionUtils;

/**
 * @author: lizhilong
 * @date:   2017-11-15 11:41:12   
 */
@AllArgsConstructor
public class ViolationBuild{

    @Getter
    private Set<Violation> violations;

    public String getMessage() {
        List<String> list = new ArrayList<String>();
        for (Violation violation : violations) {
            list.add(violation.getMessage());
        }
        return list.size() > 0 ? list.get(0) : "";
    }

    public static <T> ViolationBuild build(Set<ConstraintViolation<T>> cvs) {
        Set<Violation> result = new HashSet<Violation>();
        if (CollectionUtils.isNotEmpty(cvs)) {
            for (ConstraintViolation cv : cvs) {
                result.add(new Violation(cv.getMessage(), cv.getRootBean() == null ? null : cv.getRootBean().toString(),
                                         cv.getPropertyPath() == null ? null : cv.getPropertyPath().toString(),
                                         cv.getInvalidValue()));
            }
        }
        return new ViolationBuild(result);
    }
}

用來校驗實體,構建并存儲校驗后的信息ValidatorProvider

package com.alibaba.xianzhi.validator;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author: lizhilong
 * @date:   2017-11-15 11:40:59   
 */
@AllArgsConstructor
@Getter
public class ValidatorProvider {
    private final Validator validator;

    public <T> ViolationBuild validate(T object) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validate(object);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }

    public <T> ViolationBuild validate(T object, Class<?>... groups) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validate(object, groups);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }

    public <T> ViolationBuild validateProperty(T object, String propertyName, Class<?>... groups) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validateProperty(object, propertyName, groups);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }

    public <T> ViolationBuild validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
        Set<ConstraintViolation<T>> violations;
        try {
            violations = validator.validateValue(beanType, propertyName, value, groups);
        } catch (IllegalArgumentException iae) {
            throw iae;
        } catch (ValidationException ve) {
            throw ve;
        }
        return ViolationBuild.build(violations);
    }
}

BaseService讓自己的service繼承此類

java不能多繼承 所以如果已經繼承了別的類,可以將此類注入出來

此類是為了拿到一個單例的ValidatorProvider

package com.alibaba.xianzhi.base.web;
import javax.annotation.Resource;
import javax.validation.Validator;
import com.alibaba.xianzhi.validator.ValidatorProvider;

/**
 * BaseService
 * @author: lizhilong
 * @date:   2017-11-15 11:41:24   
 */
public abstract class BaseService {

    @Resource
    protected Validator validator;

    private ValidatorProvider validatorProvider;

    protected ValidatorProvider getValidatorProvider() {
        if (validatorProvider == null) {
            validatorProvider = new ValidatorProvider(validator);
        }
        return validatorProvider;
    }
}

所需校驗的實體類

說明:Constants為接口常量

@Getter
@AllArgsConstructor
public class SubmitVO extends BaseVO {

    @NotNull(message="廠商不能為空")
    private Long companyId;

    @Length(min=0, max=100, message="標題請控制在" + Constants.MAX_TITLE + "個字符以內")
    @NotNull(message="標題不能為空")
    private String title;

    @Length(min=0, max=65535, message="修復方案長度不能超過" + Constants.MAX_FIX_ADVICE)
    @NotNull(message="修復方案不能為空")
    private String fixAdvice;
}

下面就是如何使用

public BaseResponse save(SubmitVO submitVO ) {
/**
 * getValidatorProvider()此方法是BaserService中,
 * 上面說到本人的service是繼承此  
 * service的所以可以直接用
 **/
ValidatorProvider validatorProvider = getValidatorProvider();
/**
 * validatorProvider調用validate(Object obj)進行校驗
 * 返回ViolationBuild 
 **/
ViolationBuild validateFlaw = validatorProvider.validate(submitVO);
/**
 * 此時如果校驗有失敗的 容器中便會存儲信息,ViolationBuild可以通過自己的
 * getMessage方法獲取信息(此方法可以自己封裝成自己想要的樣子)
 **/
System.out.println(validateFlaw.getMessage());
 }

打印結果:標題請控制在100個字符以內

以上是“javax.validation結合spring的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

且末县| 南丰县| 阿拉善左旗| 乐清市| 永德县| 同江市| 汾阳市| 石阡县| 海门市| 灯塔市| 璧山县| 寻乌县| 景洪市| 山西省| 阜阳市| 荔波县| 赞皇县| 普安县| 新竹市| 湘西| 宽城| 鞍山市| 深泽县| 绥芬河市| 绥中县| 宁化县| 夹江县| 同德县| 陵水| 泸州市| 莱西市| 岚皋县| 普兰县| 潜江市| 阿拉善右旗| 昌乐县| 宜州市| 上饶县| 安新县| 廉江市| 军事|