最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Validation和Hibernate Validator結(jié)合國際化代碼實例

 更新時間:2023年10月09日 09:45:48   作者:蠟筆小久  
這篇文章主要介紹了Spring Validation和Hibernate Validator結(jié)合國際化代碼實例,我們需要對請求參數(shù)進行非空、長度、正確性進行校驗, 本文主要講解Spring Validation 和 Hibernate Validator, 同時整合i18n(國際化)實現(xiàn)參數(shù)校驗自動,需要的朋友可以參考下

一、Spring Validation是什么?

日常開發(fā)中, 我們需要對請求參數(shù)進行非空、長度、正確性進行校驗, 如果不使用Spring Validation,那我們會在代碼中寫很多的if來校驗, 這樣做也可以,但不優(yōu)雅, 為了優(yōu)雅的進行入?yún)⑿r? 此時我們就需要Spring Validation.

二、項目說明

1.引入依賴

依賴如下:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--lombok插件-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<!--驗證包-->
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>2.0.1.Final</version>
		</dependency>
		<!--hibernate validator依賴-->
		<dependency>
			<groupId>org.hibernate.validator</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>6.1.6.Final</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.74</version>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>30.0-jre</version>
		</dependency>

2.代碼介紹

多語言和Spring Validation Bean初始化:

package com.zzb.valid.config;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.StandardCharsets;
/**
 * @author create by zhouzongbo on 2020/10/27.
 */
@Configuration
public class MessageConfig implements WebMvcConfigurer {
    /**
     * 初始化多語言
     * @return MessageSource
     */
    @Bean
    public MessageSource resourceBundleMessageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.toString());
        // 多語言文件地址.
        messageSource.addBasenames("i18n/valid");
        return messageSource;
    }
    /**
     * 本地校驗工廠bean
     * @return LocalValidatorFactoryBean
     */
    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        // 設置消息源
        bean.setValidationMessageSource(resourceBundleMessageSource());
        return bean;
    }
    @Bean
    public MethodValidationPostProcessor validationPostProcessor() {
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        processor.setValidator(localValidatorFactoryBean().getValidator());
        return processor;
    }
    @Override
    public Validator getValidator() {
        return localValidatorFactoryBean();
    }
}

全局異常處理代碼片段: Spring Validation 如果在校驗時出現(xiàn)了異常, 會拋出org.springframework.web.bind.MethodArgumentNotValidException, 因此這里對MethodArgumentNotValidException進行攔截, 然后重新組裝返回信息.

@ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ResultEntity<?> test(MethodArgumentNotValidException ex) {
        String errorMessage = buildErrorMessage(ex.getBindingResult());
        return ResultEntity.failure(errorMessage);
    }

重新組裝異常信息

private String buildErrorMessage(BindingResult result) {
        StringBuilder builder = new StringBuilder();
        for (FieldError error : result.getFieldErrors()) {
            final String defaultMessage = error.getDefaultMessage();
            if (hasDefaultMessage(error)) {
                builder.append(defaultMessage).append("\n");
            } else {
                // 提取錯誤屬性值. 比如@Range 那么錯誤屬性值包含min 和max
                final Object[] arguments = error.getArguments();
                Object[] args;
                if (arguments == null || 1 == arguments.length) {
                    args = new Object[0];
                } else {
                    args = new Object[arguments.length - 1];
                    System.arraycopy(arguments, 1, args, 0, args.length);
                }
                // 獲取錯誤信息.
                final String code = I18nUtil.getMessage(error.getCode(), args);
                final String field = I18nUtil.getMessage(error.getField(), "", args);
                if (StringUtils.isEmpty(field)) {
                    builder.append("[").append(error.getField()).append("]: ");
                } else {
                    builder.append(field);
                }
                builder.append(StringUtils.isEmpty(code) ? defaultMessage : code).append("\n");
            }
        }
        for (ObjectError globalError : result.getGlobalErrors()) {
            builder.append(globalError.getDefaultMessage()).append("\n");
        }
        return builder.toString();
    }

3.自定義約束注解

用戶名長度校驗注解:

@Target(value = { ElementType.FIELD, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
@Repeatable(UsernameLength.List.class)
@Constraint(validatedBy = UsernameLengthValidator.class) //
public @interface UsernameLength {
    String message() default "{com.zzb.valid.util.validator.UsernameLength}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    /**
     * 允許添加多個重復注解.
     */
    @Target({ElementType.FIELD, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @interface List {
        UsernameLength[] value();
    }
}

用戶名長度校驗Validator: 這里需要實現(xiàn)javax.validation.ConstraintValidator用于定義具體的校驗規(guī)則,這里只校驗了字符串的長度.

public class UsernameLengthValidator implements ConstraintValidator<UsernameLength, String> {
    public static final int MAX_LENGTH = 20;
    public static final int MIN_LENGTH = 1;
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return !StringUtils.isEmpty(value) && value.length() >= MIN_LENGTH && value.length() <= MAX_LENGTH;
    }
}

4.測試用例

從valid.properties中讀取異常提示信息,從而適配多語言.

在這里插入圖片描述

4.1中文環(huán)境異常提示信息

在這里插入圖片描述

4.2 英文環(huán)境異常提示信息.

此處與中文唯一不同的地方是把Accept-Language 設置為英文環(huán)境.

在這里插入圖片描述

5.調(diào)用鏈

org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite#resolveArgument
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#resolveArgument
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver#validateIfApplicable
org.springframework.validation.DataBinder#validate(java.lang.Object...)
org.springframework.validation.DataBinder#getInternalBindingResult
org.springframework.validation.beanvalidation.LocalValidatorFactoryBean # 使用個factoryBean進行校驗.
org.springframework.boot.autoconfigure.validation.ValidatorAdapter#validate(java.lang.Object, org.springframework.validation.Errors)
org.springframework.validation.beanvalidation.SpringValidatorAdapter#validate(java.lang.Object, org.springframework.validation.Errors)
org.springframework.validation.beanvalidation.SpringValidatorAdapter#determineField

到此這篇關于Spring Validation和Hibernate Validator結(jié)合國際化代碼實例的文章就介紹到這了,更多相關Validation和Validator結(jié)合國際化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 通過java備份恢復mysql數(shù)據(jù)庫的實現(xiàn)代碼

    通過java備份恢復mysql數(shù)據(jù)庫的實現(xiàn)代碼

    這篇文章主要介紹了如何通過java備份恢復mysql數(shù)據(jù)庫,其實一般情況下通過bat或sh就可以,這里主要是介紹了java的實現(xiàn)思路,喜歡的朋友可以參考下
    2013-09-09
  • 通過JWT來解決登錄認證問題的方案

    通過JWT來解決登錄認證問題的方案

    Json web token (JWT),是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC7519),該token被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景,本文給大家介紹了如何通過 JWT 來解決登錄認證問題,需要的朋友可以參考下
    2024-12-12
  • Spring Cloud Gateway(讀取、修改 Request Body)的操作

    Spring Cloud Gateway(讀取、修改 Request Body)的操作

    這篇文章主要介紹了Spring Cloud Gateway(讀取、修改 Request Body)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • RabbitMq消息防丟失功能實現(xiàn)方式講解

    RabbitMq消息防丟失功能實現(xiàn)方式講解

    這篇文章主要介紹了RabbitMq消息防丟失功能實現(xiàn),RabbitMQ中,消息丟失可以簡單的分為兩種:客戶端丟失和服務端丟失。針對這兩種消息丟失,RabbitMQ都給出了相應的解決方案
    2023-01-01
  • java刪除文件時總是返回false,刪不掉的解決方案

    java刪除文件時總是返回false,刪不掉的解決方案

    這篇文章主要介紹了java刪除文件時總是返回false,刪不掉的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Spring3.x 升級至 Spring4.x的方法

    詳解Spring3.x 升級至 Spring4.x的方法

    本篇文章主要介紹了詳解Spring3.x 升級至 Spring4.x的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • windows定時器配置執(zhí)行java jar文件的方法詳解

    windows定時器配置執(zhí)行java jar文件的方法詳解

    這篇文章主要給大家介紹了關于windows定時器配置執(zhí)行java jar文件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java實現(xiàn)的并發(fā)任務處理實例

    Java實現(xiàn)的并發(fā)任務處理實例

    這篇文章主要介紹了Java實現(xiàn)的并發(fā)任務處理方法,結(jié)合實例形式較為詳細的分析了基于線程操作并發(fā)任務的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例

    Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例

    這篇文章主要為大家介紹了Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java 發(fā)送http請求上傳文件功能實例

    Java 發(fā)送http請求上傳文件功能實例

    本文通過實例代碼給大家介紹了Java 發(fā)送http請求上傳文件功能,需要的朋友參考下吧
    2017-06-06

最新評論

修水县| 上蔡县| 汾西县| 大方县| 木里| 鹰潭市| 买车| 松阳县| 平顶山市| 丽水市| 庄浪县| 绥滨县| 平江县| 项城市| 平远县| 沾化县| 嵊州市| 岳阳县| 武定县| 简阳市| 原平市| 小金县| 廉江市| 穆棱市| 板桥市| 洛浦县| 台中市| 卓尼县| 瑞安市| 五大连池市| 福泉市| 阜康市| 博爱县| 儋州市| 平利县| 昂仁县| 合阳县| 大名县| 宜黄县| 顺义区| 进贤县|