Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot实现统一响应提示国际化

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

作者头像
半月无霜
发布于 2023-03-07 12:04:24
发布于 2023-03-07 12:04:24
98301
代码可运行
举报
文章被收录于专栏:半月无霜半月无霜
运行总次数:1
代码可运行

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

一、介绍

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

简单示例如下

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

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


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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
i18n: en_US

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

自定义异常BanmoonException.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战:第二十章:i18n国际化(已实现中文,英文,波兰文)
创建一个maven模块 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/
Java廖志伟
2021/08/18
5030
实战:第二十章:i18n国际化(已实现中文,英文,波兰文)
如何使用Spring Boot轻松实现国际化和本地化
国际化(Internationalization) 是指为了适应不同语言、文化和地区的用户,使软件能够方便地进行本地化修改的过程。国际化(Internationalization) 简称i18n,其中 “i” 是Internationalization的首字母 ,“n” 是最后一个字母 , “18” 代表了中间省略的18个字母。
索码理
2024/02/22
3.3K2
如何使用Spring Boot轻松实现国际化和本地化
Spring Boot 两行代码轻松实现国际化
在开发中,国际化(Internationalization),也叫本地化,指的是一个网站(或应用)可以支持多种不同的语言,即可以根据用户所在的语言类型和国家/地区,显示不同的文字。能够让不同国家,不同语种的用户方便使用,提高用户体验性。
Java旅途
2021/05/07
3K0
springboot-i18n国际化
In computing, internationalization and localization are means of adapting computer software to different languages, regional peculiarities and technical requirements of a target locale.
用户2146693
2019/08/08
1.4K0
springboot-i18n国际化
SpringBoot 多语言 – 国际化 – i18n
快速小结:LocaleResolver接口的实现类获得Locale对象,Locale对象告诉MessageSource从哪个配置文件获得消息!
收心
2024/06/15
1.1K0
SpringBoot 多语言 – 国际化 – i18n
从源码看Spring的i18n·优雅的国际化实战
互联网业务出海,将已有的业务Copy to Global,并且开始对各个国家精细化,本土化的运营。对于开发人员来说,国际化很重要,在实际项目中所要承担的职责是按照客户指定的语言让服务端返回相应语言的内容。本文基于spring的国际化支持,实现国际化的开箱即用,静态文件配置刷新生效以及全局异常国际化处理。
简熵
2023/03/06
3.2K0
从源码看Spring的i18n·优雅的国际化实战
SpringBoot - 统一格式封装及高阶全局异常处理
Spring Boot2.x-11 使用@ControllerAdvice和@ExceptionHandler实现自定义全局异常
小小工匠
2022/02/16
1.6K0
SpringBoot - 统一格式封装及高阶全局异常处理
Spring之 国际化:i18n
国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配置文件。
叫我阿杰好了
2024/01/04
7840
Spring之 国际化:i18n
Spring-国际化信息03-容器级的国际化信息资源
在一般情况下,国际化信息资源应该是容器级。我们一般不会将MessageSource作为一个Bean注入到其他的Bean中,相反MessageSource作为容器的基础设施向容器中所有的Bean开放。
小小工匠
2021/08/16
2420
Spring i18n国际化
随着互联网的发展,越来越多的企业和个人开始关注全球化的需求。在这个背景下,多语言支持成为了一个重要的课题。Spring框架作为一款优秀的Java开发框架,提供了丰富的i18N支持,能帮助搬砖工快速实现多语言应用。
鱼找水需要时间
2023/06/20
3490
Spring i18n国际化
使用dropwizard(6)-国际化-easy-i18n
前言 Dropwizard官方文档并没有提供国际化的模块,所以只能自己加。Spring的MessageResource用的很顺手,所以copy过来。 Easy i18n 在整合Dropwizard的时候,多语言貌似只能通过jdk自带的ResourceBundle拿数据。其实也就够了,但在开发过程中发现需要缓存,需要解析占位符等。代码越写越多,显然不是仅仅一个调用就完事的。写的差不多的时候突然觉得和spring context里的message source结构类似。于是,放弃维护已经开始变的复杂的逻辑,直
Ryan-Miao
2018/03/14
1.2K0
使用dropwizard(6)-国际化-easy-i18n
Springboot国际化
源代码: https://github.com/FutaoSmile/springbootFramework
喜欢天文的pony站长
2020/06/29
8570
Springboot国际化
从零玩转后端接口数据交互国际化
当我们的项目涉及到多语言支持时,身为后端开发的我们,接口数据国际化便是我们必须攻克的问题。
Blue_007
2023/11/06
4.6K7
从零玩转后端接口数据交互国际化
学习SpringMVC——国际化+上传+下载
  每个星期一道菜,这个星期也不例外~~~   一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好……这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品做大了,用的人多了,不仅仅再是上海人用,北京人用,还有印度人用,法国人用等等,可以说这个产品已经走上了国际化的大舞台。当印度的哥们输入url访问产品时,界面上弹出“欢迎您,三哥”,估计哥们当场就蒙圈了。而这个时候,国际化就应运而生了。   要做国际化这道菜,真的没有想象中的那么复杂,反而很简单,不信你看
JackieZheng
2018/01/16
7870
学习SpringMVC——国际化+上传+下载
spring mvc 国际化的几种方案
通过设置浏览器请求测试:http://localhost:8080/xxx/nation/test
用户1418372
2018/09/13
2.6K0
Spring boot国际化
修改properties文件的目录:在application.yml或者application.properties中配置 spring.message.basename
JadePeng
2018/08/22
1.4K0
Spring boot国际化
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
在这里,我们将国际化与Spring MVC结合起来,看SpringMVC如何整合国际化(其实03中已经阐述了)。
小小工匠
2021/08/17
5970
Spring核心——MessageSource实现国际化
在上下文与IoC对ApplicationContext以及Context相关的设计模式进行了介绍。ApplicationContext作为一个Context在应用的运行层提供了IoC容器、事件、国际化等功能接口。
随风溜达的向日葵
2018/08/15
5K0
加载国际化文件的几种姿势
利用ResourceBundle加载国际化文件,这里列出四个方法,分别是利用默认Locale、zh_CN、en_US以及带占位符的处理方式。这里需要注意的是BaseName为classpath下的目录+/+国际化文件名前缀,即i18n/mymessage
我的小碗汤
2018/08/22
1.1K0
加载国际化文件的几种姿势
Java国际化/本地化实战
开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回英文界面,而中文的操作系统则返回中文界面——这便是典型的i18n国际化问题。
JavaEdge
2020/05/27
2.5K0
Java国际化/本地化实战
相关推荐
实战:第二十章:i18n国际化(已实现中文,英文,波兰文)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验