前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot实现统一响应提示国际化

SpringBoot实现统一响应提示国际化

作者头像
半月无霜
发布2023-03-07 20:04:24
6090
发布2023-03-07 20:04:24
举报
文章被收录于专栏:半月无霜半月无霜

SpringBoot实现统一响应提示国际化

一、介绍

统一响应大家都见识过,只需要添加上@RestControllerAdvice后进行处理即可

简单示例如下

代码语言:javascript
复制
package com.banmoon.test.core.handler;

import com.banmoon.test.obj.dto.ResultData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class ControllerHandler {
    
    @ExceptionHandler(Exception.class)
    public ResultData exceptionHandler(Exception exception){
        log.error("统一异常", exception);
        return ResultData.fail("服务器繁忙,请稍后再试!");
    }
}

这里的服务器繁忙,请稍后再试!,仅仅只有中文,能不能实现国际化的语言呢

本文将介绍使用i18n,来完成国际化语言的使用。

i18n是什么,全称internationalization,取首字母,尾字母,18代表中间的十八个字母。 在spring中使用i18n来完成国际化

二、代码

spring中,有这么一个接口MessageSource,它是专门用来解决国际化问题的。

其中有这么一个实现类ResourceBundleMessageSource,从配置文件中读取国际化的语言,进行展示

首先,我们得准备好三份配置文件,分别如下

  • exceptionMessage_en_US.properties
代码语言:javascript
复制
default=Server busy, please try again later!
1000=The record already exists in the database
2000=Uploading file exception
  • exceptionMessage_zh_CN.properties
代码语言:javascript
复制
default=服务器繁忙,请稍后再试!
1000=数据库中已存在该记录
2000=上传文件异常
  • exceptionMessage_zh_TW.properties
代码语言:javascript
复制
default=服務器繁忙,請稍後再試!
1000=數據庫中已存在該記錄
2000=上傳文件異常

注意命名格式,这很重要,这样即可名称_[语言]_[国家].properties


准备好配置文件后,我将进行加载,创建出一个ResourceBundleMessageSourcebean,加载上面的配置文件

代码语言:javascript
复制
package com.banmoon.test.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;

@Configuration
public class MessageSourceConfig {

    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasenames("i18n/exceptionMessage");
        return messageSource;
    }

}

如此,国际化的语言就配置完毕,接下来就是读取了


再写一个工具类用来读取

代码语言:javascript
复制
package com.banmoon.test.utils;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.extra.spring.SpringUtil;
import org.springframework.context.MessageSource;

import java.util.Locale;

import static java.util.Locale.CHINA;

public class MessageSourceUtil {

    public static final MessageSource messageSource;

    public static final String i18nStr;

    public static final Locale locale;

    static {
        messageSource = SpringUtil.getBean("messageSource");
        i18nStr = SpringUtil.getProperty("i18n");
        String[] arr = i18nStr.split("_");
        locale = ArrayUtil.isNotEmpty(arr) ? new Locale(arr[0], arr[1]) : CHINA;
    }

    public static String getMessage(Integer code, Object... objs) {
        return messageSource.getMessage(String.valueOf(code), objs, locale);
    }

    public static String getMessage(String code, Object... objs) {
        return messageSource.getMessage(code, objs, locale);
    }

}

指定使用哪种语言环境

这个看大家以后国际化的定制,如何确定当前的语言环境

本文是由配置文件进行配置的,读取并生成Locale对象

代码语言:javascript
复制
i18n: en_US

最后,就是统一异常捕获的相关类了

自定义异常BanmoonException.java

代码语言:javascript
复制
package com.banmoon.test.core.exception;

import com.banmoon.test.utils.MessageSourceUtil;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class BanmoonException extends RuntimeException {

    private Integer code;

    private String msg;

    public BanmoonException(Integer code) {
        this(code, MessageSourceUtil.getMessage(code));
    }

    public BanmoonException(Integer code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
    }
}

统一异常拦截类

代码语言:javascript
复制
package com.banmoon.test.core.handler;

import com.banmoon.test.core.exception.BanmoonException;
import com.banmoon.test.obj.dto.ResultData;
import com.banmoon.test.utils.MessageSourceUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class ControllerHandler {

    @ExceptionHandler(Exception.class)
    public ResultData<?> exceptionHandler(Exception exception){
        log.error("统一异常", exception);
        return ResultData.fail(MessageSourceUtil.getMessage("default"));
    }

    @ExceptionHandler(BanmoonException.class)
    public ResultData<?> BanmoonExceptionHandler(BanmoonException exception){
        log.error("自定义异常", exception);
        Integer code = exception.getCode();
        return ResultData.fail(code, MessageSourceUtil.getMessage(code));
    }
}

三、测试

测试就使用一个接口进行测试

代码语言:javascript
复制
package com.banmoon.test.controller;

import com.banmoon.test.core.exception.BanmoonException;
import com.banmoon.test.obj.dto.ResultData;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Objects;

@Slf4j
@Api(tags = "国际化测试")
@RestController
public class MessageSourceController {

    @GetMapping("i18n")
    public ResultData<String> i18n(@RequestParam(required = false) Integer code) {
        if (Objects.nonNull(code)) {
            throw new BanmoonException(code);
        } else {
            int i = 1 / 0;
        }
        return new ResultData<>();
    }

}

启动服务,请求进行测试

请求

配置文件

结果

i18n: en_US

i18n: en_US

i18n: zh_TW

i18n: zh_TW

四、最后

在使用ResourceBundleMessageSource.java实现类时,也可以关注其它的一些实现类,其中

  • ReloadableResourceBundleMessageSource.java:可以实现重载国际化文件
  • StaticMessageSource.java:可以通过代码的方式获取,用此实现类可以实现数据库表中的国际化信息读取

我是半月,你我一同共勉!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringBoot实现统一响应提示国际化
    • 一、介绍
      • 二、代码
        • 三、测试
          • 四、最后
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档