欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于javax.validation結(jié)合spring的最佳實(shí)踐

 更新時(shí)間:2021年07月28日 08:49:51   作者:熬夜是小狗  
這篇文章主要介紹了javax.validation結(jié)合spring的最佳實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

本人先將用到的配置、工具類貼出來(lái),然后一步步告訴大家怎么使用

JSR303 是一套JavaBean參數(shù)校驗(yàn)的標(biāo)準(zhǔn),它定義了很多常用的校驗(yàn)注解,我們可以直接將這些注解加在我們JavaBean的屬性上面,就可以在需要校驗(yàn)的時(shí)候進(jìn)行校驗(yàn)了。

注解如下:

這里寫(xiě)圖片描述

Hibernate validator 在JSR303的基礎(chǔ)上對(duì)校驗(yàn)注解進(jìn)行了擴(kuò)展,擴(kuò)展注解如下:

這里寫(xiě)圖片描述

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實(shí)體

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

@AllArgsConstructor 這個(gè)注解是lombok中為類提供一個(gè)全參的構(gòu)造方法

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

封裝一個(gè)ViolationBuild

后面會(huì)說(shuō)這個(gè)類的用法

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

用來(lái)校驗(yàn)實(shí)體,構(gòu)建并存儲(chǔ)校驗(yàn)后的信息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不能多繼承 所以如果已經(jīng)繼承了別的類,可以將此類注入出來(lái)

此類是為了拿到一個(gè)單例的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;
    }
}

所需校驗(yàn)的實(shí)體類

說(shuō)明:Constants為接口常量

@Getter
@AllArgsConstructor
public class SubmitVO extends BaseVO {

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

    @Length(min=0, max=100, message="標(biāo)題請(qǐng)控制在" + Constants.MAX_TITLE + "個(gè)字符以內(nèi)")
    @NotNull(message="標(biāo)題不能為空")
    private String title;

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

下面就是如何使用

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

打印結(jié)果:標(biāo)題請(qǐng)控制在100個(gè)字符以內(nèi)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis集成Spring流程詳解

    MyBatis集成Spring流程詳解

    在實(shí)際開(kāi)發(fā)中不僅僅是要展示數(shù)據(jù),還要構(gòu)成數(shù)據(jù)模型添加數(shù)據(jù),這篇文章主要介紹了SpringBoot集成Mybatis操作數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn)

    SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn)

    Ribbon是一個(gè)客戶端負(fù)載均衡器,它提供了對(duì)HTTP和TCP客戶端的行為的大量控制。這篇文章主要介紹了SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng)

    Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)ATM機(jī)操作系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java 8實(shí)現(xiàn)圖片BASE64編解碼

    Java 8實(shí)現(xiàn)圖片BASE64編解碼

    Java 8終于有了標(biāo)準(zhǔn)的方法來(lái)處理base64的編解碼。Java一直缺少BASE64編碼API,以至于通常在項(xiàng)目開(kāi)發(fā)中會(huì)選用第三方的API實(shí)現(xiàn)。但是,Java 8實(shí)現(xiàn)了BASE64編解碼API,它包含到j(luò)ava.util包。下面這篇文章我會(huì)對(duì)Java 8的BASE64編解碼做一個(gè)詳細(xì)的介紹。
    2016-10-10
  • Mybatis分頁(yè)P(yáng)ageHelper插件代碼實(shí)例

    Mybatis分頁(yè)P(yáng)ageHelper插件代碼實(shí)例

    這篇文章主要介紹了Mybatis分頁(yè)P(yáng)ageHelper插件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解Springboot之Logback的使用學(xué)習(xí)

    詳解Springboot之Logback的使用學(xué)習(xí)

    Logback是SpringBoot內(nèi)置的日志處理框架,你會(huì)發(fā)現(xiàn)spring-boot-starter其中包含了spring-boot-starter-logging,該依賴內(nèi)容就是Spring Boot默認(rèn)的日志框架logback,本文詳細(xì)介紹了該框架 ,需要的朋友可以參考下
    2021-05-05
  • Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之隊(duì)列

    Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之隊(duì)列

    這篇文章主要介紹了Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),隊(duì)列是一種特殊的線性表,只允許在表的隊(duì)頭進(jìn)行刪除操作,在表的后端進(jìn)行插入操作,隊(duì)列是一個(gè)有序表先進(jìn)先出,想了解更多相關(guān)資料的小伙伴可以參考下面文章的詳細(xì)內(nèi)容
    2022-02-02
  • java 使用memcached以及spring 配置memcached完整實(shí)例代碼

    java 使用memcached以及spring 配置memcached完整實(shí)例代碼

    本篇文章主要介紹了java 使用memcached以及spring 配置memcached完整實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • 詳解Spring Boot 部署jar和war的區(qū)別

    詳解Spring Boot 部署jar和war的區(qū)別

    本篇文章主要介紹了詳解Spring Boot 部署jar和war的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Java8中Optional的使用方法詳解

    Java8中Optional的使用方法詳解

    這篇文章主要介紹了Java8中Optional的使用方法詳解,傳統(tǒng)的寫(xiě)代碼方式經(jīng)常會(huì)遇到NullPointerException,這就需要我們?cè)诖a中經(jīng)常判空,而判空的寫(xiě)法又會(huì)顯得很累贅,這里就可以用到Optional來(lái)簡(jiǎn)化代碼,需要的朋友可以參考下
    2024-01-01

最新評(píng)論