spring boot 国际化配置,国际化校验提示信息,校验提示信息国际化

  • spring boot 国际化配置,支持提示信息国际化,通过head 传递参数locale 动态切换语言
package com.config;

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.support.RequestContextUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * @ClassName ValidatorConfigurationil8n
 * @Description: 校验配置及校验信息国际化配置
 * @Author 
 * @Date 2020/4/9 10:38
 * @Version V1.0
 **/
@Configuration
@EnableWebMvc
//@ComponentScan
public class ValidatorConfigurationil8n implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public Validator getValidator() {
        return validator();
    }

    @Override
    public void addInterceptors(final InterceptorRegistry registry) {
        registry.addInterceptor(new MyLocaleChangeInterceptor());
    }

    /***
    * 默认语言为 简写中文
    * @methodName  localeResolver
    * @return org.springframework.web.servlet.i18n.SessionLocaleResolver
    * @author 
    * @date 2020/4/9 14:59
    * @throws
    */
    @Bean
    public SessionLocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(Locale.CHINA);
        return localeResolver;
    }

    /***
    * 加载提示信息国际化资源目录地址
    * @methodName  messageSource
    * @return org.springframework.context.support.ResourceBundleMessageSource
    * @author 
    * @date 2020/4/9 15:00
    * @throws
    */
    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setBasenames("i18n/ValidationMessages");
        return messageSource;
    }

    /***
    *  定义校验validation bean 模式为快速失败返回
    * @methodName  validator
    * @return org.springframework.validation.beanvalidation.LocalValidatorFactoryBean
    * @author 
    * @date 2020/4/9 15:01
    * @throws
    */
    @Bean
    public LocalValidatorFactoryBean validator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setProviderClass(HibernateValidator.class);
        validator.setValidationMessageSource(messageSource());
        // 设置validator模式为快速失败返回
        Map<String, String> validationPropertyMap = new HashMap(1);
        validationPropertyMap.put("hibernate.validator.fail_fast", "true");
        validator.setValidationPropertyMap(validationPropertyMap);
        return validator;
    }

    class MyLocaleChangeInterceptor extends LocaleChangeInterceptor {

        /***
        *  定义拦截国际化请求咨询,通过head 获取请求语言资源
        * @methodName  preHandle
        * @param request
         * @param response
         * @param handler
        * @return boolean
        * @author 
        * @date 2020/4/9 15:02
        * @throws
        */
        @Override
        public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler)
                throws ServletException {

            String newLocale = request.getParameter(getParamName());
            if (newLocale != null) {
                return super.preHandle(request, response, handler);
            }

            else {
                // 前端通过head 请求切换语言资源
                newLocale = request.getHeader("locale");
                if (newLocale != null) {
                    LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
                    if (localeResolver == null) {
                        throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
                    }

                    try {
                        localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
                    } catch (IllegalArgumentException ex) {
                        if (isIgnoreInvalidLocale()) {
                            this.logger.error("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
                        } else {
                            throw ex;
                        }
                    }
                }
            }

            return true;
        }
    }

}
  •  文件配置

    路径:classpath:/i18n
    英文配置文件:
    ValidationMessages_en_US.properties
    中文配置文件:
    ValidationMessages_zh_CN.properties

     文件中对应的配置信息

spring 中使用

  • 语言切换

    head 中locale 参数切换语言
    zh_CN 中文,en_US 英文 ,缺省默认中文

  • 国际化全局异常处理 第三方copy 过来

 



import com.sue.demo.controller.ResponseResult;

import com.sue.demo.enums.ResultEnum;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.http.HttpStatus;

import org.springframework.http.converter.HttpMessageNotReadableException;

import org.springframework.util.StringUtils;

import org.springframework.validation.BindingResult;

import org.springframework.validation.FieldError;

import org.springframework.validation.ObjectError;

import org.springframework.web.bind.MethodArgumentNotValidException;

import org.springframework.web.bind.MissingServletRequestParameterException;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseStatus;

import org.springframework.web.bind.annotation.RestControllerAdvice;

 

import java.util.List;

 

@RestControllerAdvice("com.sue.demo.controller")

public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

 

    /**

     * 忽略参数异常处理器

     *

     * @param e 忽略参数异常

     * @return ResponseResult

     */

    @ResponseStatus(HttpStatus.BAD_REQUEST)

    @ExceptionHandler(MissingServletRequestParameterException.class)

    public ResponseResult parameterMissingExceptionHandler(MissingServletRequestParameterException e) {

        logger.error("", e);

        return new ResponseResult(ResultEnum.PARAMETER_ERROR.getCode(), "请求参数 " + e.getParameterName() + " 不能为空");

    }

 

    /**

     * 缺少请求体异常处理器

     *

     * @param e 缺少请求体异常

     * @return ResponseResult

     */

    @ResponseStatus(HttpStatus.BAD_REQUEST)

    @ExceptionHandler(HttpMessageNotReadableException.class)

    public ResponseResult parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {

        logger.error("", e);

        return new ResponseResult(ResultEnum.PARAMETER_ERROR.getCode(), "参数体不能为空");

    }

 

    /**

     * 参数效验异常处理器

     *

     * @param e 参数验证异常

     * @return ResponseInfo

     */

    @ResponseStatus(HttpStatus.BAD_REQUEST)

    @ExceptionHandler(MethodArgumentNotValidException.class)

    public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e) {

        logger.error("", e);

        // 获取异常信息

        BindingResult exceptions = e.getBindingResult();

        // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息

        if (exceptions.hasErrors()) {

            List<ObjectError> errors = exceptions.getAllErrors();

            if (!errors.isEmpty()) {

                // 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可

                FieldError fieldError = (FieldError) errors.get(0);

                return new ResponseResult(ResultEnum.PARAMETER_ERROR.getCode(), fieldError.getDefaultMessage());

            }

        }

        return new ResponseResult(ResultEnum.PARAMETER_ERROR);

    }

 

    /**

     * 自定义参数错误异常处理器

     *

     * @param e 自定义参数

     * @return ResponseInfo

     */

    @ResponseStatus(HttpStatus.BAD_REQUEST)

    @ExceptionHandler({ParamaErrorException.class})

    public ResponseResult paramExceptionHandler(ParamaErrorException e) {

        logger.error("", e);

        // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息

        if (!StringUtils.isEmpty(e.getMessage())) {

            return new ResponseResult(ResultEnum.PARAMETER_ERROR.getCode(), e.getMessage());

        }

        return new ResponseResult(ResultEnum.PARAMETER_ERROR);

    }

 

    /**

     * 其他异常

     *

     * @param e

     * @return

     */

    @ResponseStatus(HttpStatus.BAD_REQUEST)

    @ExceptionHandler({Exception.class})

    public ResponseResult otherExceptionHandler(Exception e) {

        logger.error("其他异常", e);

        // 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息

        if (!StringUtils.isEmpty(e.getMessage())) {

            return new ResponseResult(ResultEnum.UNKNOWN_ERROR.getCode(), e.getMessage());

        }

        return new ResponseResult(ResultEnum.UNKNOWN_ERROR);

    }

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值