91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Spring如何實現校驗validator和JSR-303

發布時間:2021-10-19 17:05:30 來源:億速云 閱讀:128 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Spring如何實現校驗validator和JSR-303,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Spring 校驗(validator,JSR-303)實現

什么是JSR-303規范

JSR 303是Java EE 6中的一項子規范,叫做Bean Validation,官方參考實現是hibernate Validator,此實現與Hibernate ORM沒有任何關系。JSR 303用于對Java Bean中的字段的值進行驗證。

與Spring MVC結合

Spring-mvc.xml配置:

<!--JSR-303-->
    <mvc:annotation-driven validator="validator"/>
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="validatemessage"/>
        <property name="useCodeAsDefaultMessage" value="false"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="cacheSeconds" value="60"/>
    </bean>
    <bean  id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
        <property name="conversionService">
            <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
        </property>
        <property name="validator" ref="validator"/>
    </bean>

實體類添加驗證注解

這里貼出部分代碼,知道如何加注解即可:

import com.lemontree.common.utils.AjaxResult;
import com.lemontree.common.utils.StringUtil;
import com.lemontree.common.utils.email.EmailUtils;
import org.hibernate.validator.constraints.NotEmpty;
import java.util.Date;
public class User {
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.id
     *
     * @mbg.generated Thu Mar 16 13:27:38 CST 2017
     */
    private Integer id;
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.user_name
     *
     * @mbg.generated Thu Mar 16 13:27:38 CST 2017
     */
    @NotEmpty(message = "用戶名不能為空")
    private String userName;
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user.password
     *
     * @mbg.generated Thu Mar 16 13:27:38 CST 2017
     */
    @NotEmpty(message = "密碼不能為空")
    private String password;
    }

控制器驗證注解添加

將@Validated 注解跟在實體類前面,BindingResult緊跟其后:

@RequestMapping(value = "/login.htm", method = RequestMethod.POST)
    public @ResponseBody AjaxResult login(@Validated User user, BindingResult bindingResult,
                                          HttpServletRequest request, HttpServletResponse response) {
        if (bindingResult.hasErrors()){
            List<FieldError> errorses = bindingResult.getFieldErrors();
            if (CollectionUtils.isNotEmpty(errorses)){
                errorses.forEach(item->{
                    System.out.println(item.getDefaultMessage());
                });
            }
        }
      }

Java Hibernate Validator JSR-303驗證

JSR-303是JAVA EE 6中的一項子規范,叫做 Bean Validation,Hibernate Validator是Bean Validation 的參考實現。

實際使用就是通過注解來給字段添加約束,然后校驗字段是否符合規范,如果不符合就會拋出異常,以此來減少校驗數據的代碼,并保證拿到的數據都是符合規范的,也可以和Spring框架配合使用

集成

官方文檔

https://mvnrepository.com/artifact/org.hibernate/hibernate-validator

https://mvnrepository.com/artifact/javax.validation/validation-api

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
            <version>3.0.1-b09</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

使用

校驗對象

public class JsrTest {
    @NotNull(message = "id不能為空!")
    @Min(value = 1, message = "Id只能大于等于1")
    Integer id;
    @NotNull(message = "姓名不能為空!")
    String name;
    public void validateParams() {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();//獲取一個驗證器
        Set<ConstraintViolation<JsrTest>> violationSet = validator.validate(this);//驗證數據,獲取到錯誤集合
        Iterator<ConstraintViolation<JsrTest>> iterator = violationSet.iterator();
        if (iterator.hasNext()) {
            String errorMessage = iterator.next().getMessage();//獲取到錯誤信息
            throw new ValidationException(errorMessage);
        }
    }
    public static void main(String args[]) {
        JsrTest req = new JsrTest();
        req.id = 1;
        req.validateParams();
    }
}

像上面那樣將在屬性上添加注解即可聲明約束

校驗屬性

上面是校驗整個對象,也可以單獨校驗某個字段:

validator.validateProperty(object, "name");

分組校驗

public class JsrTest {
    @NotNull(message = "id不能為空!", groups = {ValidationGroup.class})
    @Min(value = 1, message = "Id只能大于等于1")
    Integer id;
    @NotNull(message = "姓名不能為空!", groups = {ValidationGroup.class})
    String name;
    @DecimalMin(value = "1.1")
    double price;
    int date;
    public static void validateParams(JsrTest jsrTest) {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<JsrTest>> violationSet = validator.validate(jsrTest, ValidationGroup.class);
        Iterator<ConstraintViolation<JsrTest>> iterator = violationSet.iterator();
        if (iterator.hasNext()) {
            String errorMessage = iterator.next().getMessage();
            throw new ValidationException(errorMessage);
        }
    }
    public static void main(String args[]) {
        JsrTest req = new JsrTest();
        validateParams(req);
    }    
    public interface ValidationGroup {
    }
}

分組校驗所指定的calss必須是一個接口,可以指定多個

自定義約束

通常情況下,框架提供的注解已經可以滿足正常的驗證需求,但是我們也可以自定義注解來滿足我們的需求

我們這里的例子是所注釋的字符串中不能包含指定字符

@Target(FIELD)      //元注解,定義該注解使用在字段上
@Retention(RUNTIME) //定義注解的生命周期
@Constraint(validatedBy = CustomValidator.class)//指明該注解的校驗器
@Documented         //表示該注解會被添加到JavaDoc中
public @interface CustomConstraints {
    String message() default "默認異常message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {}; //這個屬性可以用來標注錯誤的嚴重等級,但是并不被API自身所使用
    String value() default " ";
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 * 需要實現ConstraintValidator接口
 * 泛型的第一個參數是自定義的注解,第二個參數注解所注釋的字段的類型
 */
public class CustomValidator implements ConstraintValidator<CustomConstraints, String> {
    private String value;
    /**
     * 初始化調用,拿到注解所指定的value
     *
     * @param constraintAnnotation
     */
    @Override
    public void initialize(CustomConstraints constraintAnnotation) {
        value = constraintAnnotation.value();
    }
    /**
     * @param value   注釋的字段的值
     * @param context
     * @return true 通過驗證,false 未通過驗證
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value != null && value.contains(this.value)) {
            context.disableDefaultConstraintViolation();//禁用默認的消息
            context.buildConstraintViolationWithTemplate("新添加的錯誤消息").addConstraintViolation();
            return false;
        }
        return true;
    }
}

然后就可以和其他注解一樣使用它了

封裝

或者是將驗證參數的代碼提取去出來,單獨寫一個方法

public static void validateParams(Object object) {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();//獲取一個驗證器
        Set<ConstraintViolation<Object>> violationSet = validator.validate(object);//驗證數據,獲取到錯誤集合
        Iterator<ConstraintViolation<Object>> iterator = violationSet.iterator();
        if (iterator.hasNext()) {
            String errorMessage = iterator.next().getMessage();//獲取到錯誤信息
            throw new ValidationException(errorMessage);
        }
    }

當然這里也可以不拋出異常,而返回一個boolean值,如何封裝看實際需求

配合Spring使用

@GetMapping("/test")
    public Integer lookCanBuyGoods(@Valid JsrTest req, BindingResult result) throws Exception {
        if (result.hasErrors()) {
            throw new ValidationException(result.getAllErrors().get(0).getDefaultMessage());
        }
        //do something...
        return 1;
    }

@Valid添加這個注解之后就會對參數進行驗證,如果在其后沒有跟BindingResult,驗證不通過就會直接拋出異常,如果添加了BindingResult參數,就不會直接拋出異常,而會把異常信息存儲在BindingResult中,供開發者自行處理

如果想要使用分組可以這樣

@GetMapping("/test")
    public Integer test(@Validated (JsrTest.ValidationGroup.class) JsrTest req, BindingResult result) throws Exception {
        if (result.hasErrors()) {
            throw new ValidationException(result.getAllErrors().get(0).getDefaultMessage());
        }
        //do something...
        return 1;
    }

@Validated如果不使用分組其作用和@Valid一致

注解使用說明

Constraint詳細信息
@Null被注釋的元素必須為 null
@NotNull被注釋的元素必須不為 null
@AssertTrue被注釋的元素必須為 true
@AssertFalse被注釋的元素必須為 false
@Min(value)被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Max(value)被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@DecimalMin(value)被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@DecimalMax(value)被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@Size(max, min)被注釋的元素的大小必須在指定的范圍內
@Digits (integer, fraction)被注釋的元素必須是一個數字,其值必須在可接受的范圍內
@Past被注釋的元素必須是一個過去的日期
@PastOrPresent被注釋的元素必須是過去或現在的日期
@Future被注釋的元素必須是一個將來的日期
@FutureOrPresent被注釋的元素必須是將來或現在的日期
@Pattern(value)被注釋的元素必須符合指定的正則表達式
@Digits(integer =, fraction =)驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度
@Email驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證
@NotBlank字符串不能是Null還有被Trim的長度要大于0
@NotEmpty不能為null,且長度大于0
@Negative被注釋的元素必須是負數
@NegativeOrZero被注釋的元素必須是負數或0
@Positive必須是正數
@PositiveOrZero必須是正數或0

關于“Spring如何實現校驗validator和JSR-303”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

尤溪县| 甘泉县| 弥勒县| 鄂托克前旗| 乐清市| 崇文区| 日土县| 丹阳市| 隆昌县| 阿拉善右旗| 永仁县| 新民市| 中方县| 宜川县| 南投县| 宜兴市| 盘锦市| 逊克县| 辽源市| 安吉县| 乌拉特前旗| 如东县| 同德县| 盐津县| 武城县| 六安市| 鄂托克旗| 晋州市| 麦盖提县| 丹棱县| 大连市| 房山区| 辉县市| 娄烦县| 广东省| 寿阳县| 安溪县| 彭山县| 平乡县| 潍坊市| 建始县|