相信很多朋友在做接口开发的时候返回给客户端的提示需要根据不同的语言切换,如果是客户端的那么客户端自己可以做,如果是服务端返回的,那就只能服务端在返回的同时做处理了,如果一个一个改,我的妈呀,什么时候是个头,唯一正确的方式就是使用AOP来实现,费话不多说,下面先贴上代码:

import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springblade.core.tool.api.R;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;/*** 对请求参数进行拦截修改* @author yuxuan*/
@Aspect
@Component
@AllArgsConstructor
@ConditionalOnProperty(prefix = "lang",name = "open",havingValue = "true")
public class LanguageAspect {private String objPreFix = "R";@Pointcut("execution(* com.rksj.controller.*.*(..))")public void annotationLangCut(){};/*** 定义一个并发性Map用来存放信息*/Map<String, String> tmpMap = new ConcurrentHashMap<>();/*** 在构造函数中进行初始化,后面可从配置文件中初始化*/public LanguageAspect(){//初始化 KEY为简体  VALUE为  简体###繁体###英文loadSysCfg();}/*** 从配置文件加载*/private void loadSysCfg(){try{//加载配置文件Resource resource = new ClassPathResource("language");InputStream is = resource.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(is);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String line = "";while( (line = bufferedReader.readLine()) != null ){//不为空且以#号开头的去掉,注释部分if(StringUtils.isNotEmpty(line) && !line.startsWith("#")){String[] lines = line.split("###");tmpMap.put(lines[0], line);}}}catch (Exception e){e.printStackTrace();}}/*** 拦截controller层返回的结果,修改msg字段* @param point* @param obj*/@AfterReturning(pointcut="annotationLangCut()",returning="obj")public void around(JoinPoint point, Object obj)  {Object backObj = obj;try{RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//从获取RequestAttributes中获取HttpServletRequest的信息HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);String bladeLang = request.getHeader("x-language");if(!Objects.isNull(obj) && obj.toString().startsWith(objPreFix)){R<?> r = (R) obj;String tmpMsg = tmpMap.get(r.getMsg().trim());if(StringUtils.isNotEmpty(tmpMsg)){String[] tmpMsgs = tmpMsg.split("###");//说明格式无问题if(tmpMsgs.length == 3){if(!Objects.isNull(bladeLang)){//简体if(bladeLang.equalsIgnoreCase("CN")){r.setMsg(tmpMsgs[0]);//繁体}else if(bladeLang.equalsIgnoreCase("TC")){r.setMsg(tmpMsgs[1]);//英文}else if(bladeLang.equalsIgnoreCase("EN")){r.setMsg(tmpMsgs[2]);}obj = r;}}}}}catch (Exception e){e.printStackTrace();//重新赋值给obj,防止try中途修改原始的值obj = backObj;}}
}

配置文件如下:

#格式为 简体中文###繁体中文###英文   行首以#开头的为注释部分
成功###成功###Successful

需要在配置文件中配置

lang.open=true

则可以开启此AOP拦截。R对象为封装的返回对象,其中msg为提示信息。

是不是很简单,感兴趣的小伙伴可以关注我哦,每天更新干货。

SpringBoot中对返回结果进行多语言切换方案(本文利用AOP实现)相关推荐

  1. 计算机在游戏过程中怎么返回页面,游戏时怎么切换到桌面,电脑打游戏时怎么切换到桌面...

    如何在game_ZOL Q&A Pro中切换到桌面,触摸并按住桌面的空白处,选择墙纸,然后打开"摇动开关"和"随机开关". 游戏如何在_中切换到桌面? ...

  2. 在c语言中怎么返回引用参数,C语言函数 函数的声明 C语言的头文件 #include的用法 形参和实参 函数的返回值 - 猫扑天空...

    C语言函数 一.是什么? 是指编程中对一块功能代码的封装,可以理解一个程序片段 二.有什么用? 可以封装代码,方便调用,提高复用性 三.怎么用? 定义:  返回值类型  函数名(形参类型 参数名1-. ...

  3. SpringBoot中fastJson返回数据展示null字段(响应值为null时字段被过滤)

    fastjson将对象转为json字符串给前端的时候, 如果字段的值为null, 则该字段默认被fastJson过滤直接不展示. 而在实际项目中我们往往也是需要展示这个字段的 , 解决即增加一个fas ...

  4. SpringBoot 国际化实现跨地区的多语言切换

    1.创建 Spring Boot + Kotlin + Maven 项目 chenguangjian:i18n-demo jack$ tree . ├── HELP.md ├── i18n-demo. ...

  5. Java Web的Struts2的多语种网站的多语言切换实例

    先看图图: 图1: 图2: 图3: 图4: 一 首先下载Properties Editor插件,该插件是支持中文的资源文件编辑器:MyEclipse 10.6 以上不用安装该插件,使用自带资源文件编辑 ...

  6. SpringBoot中怎样对外开放一个接口返回Json数据

    场景 在SpringBoot中开放一个接口,使C#程序中能访问接口并接受返回的数据. 实现 封装一个Json类 import lombok.Data;import java.io.Serializab ...

  7. 【IT】C语言函数中怎么返回一个二维数组

    C语言函数中怎么返回一个二维数组

  8. 格子玻尔兹曼方法书中,计算机代码(Fortran语言)FDM的输出结果是什么,为什么显示程序“[25024] Console1.exe”已退出,返回值为 0 (0x0)。

    格子玻尔兹曼方法书中,计算机代码(Fortran语言)FDM的输出结果是什么,为什么显示程序"[25024] Console1.exe"已退出,返回值为 0 (0x0).

  9. matlab二重指针,VC++中函数返回数组指针或者带指针的结构体的编译方式是否可取? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    libralibra 构造函数+析构函数应该是比较正规的做法吧, 你的结构体/类被提早释放的问题,是不是那个结构体是局部变量,当超出作用域时对象被销毁,如果存在析构函数,会被默认调用, 如果你返回结构 ...

最新文章

  1. 猜数字游戏_FLEX版
  2. TCP/IP协议学习笔记
  3. nodejs中的模块系统:exports导出模块
  4. 阿里云服务器如何安装memcached
  5. oracle 数据 时间间隔,如何掌握 Oracle 中的时间间隔型数据
  6. unsigned int mysql_mysql 中int类型字段unsigned和signed的探索
  7. 微信获取token -1000
  8. Javascript模拟c#中arraylist操作(学习分享)
  9. 概率论和数理统计 - 01
  10. fenking是什么意思?
  11. 1.转子动力学——引言
  12. XDOJ(智慧平台)--分配宝藏(用动态规划dp算法解决)(C语言)
  13. 第一章 计算机网络概述(计算机网络韩立刚)
  14. MoviePy合成视频没有声音
  15. js输出26个英文字母
  16. 如何将自己的代码上传到github
  17. java转义字符串中的单引号
  18. 【田园原木风格装修案例】清新自然的原木风
  19. 微机原理与接口技术 重点详解与章节总结——CPU架构详解
  20. [精华分享][Unityamp;amp;Steamamp;amp;独立游戏]如何查看steam游戏销售销量等数据

热门文章

  1. 谈谈Google Talk
  2. 【报告分享】2021中国小吃数字化推广度指数报告-饿了么x阿里巴巴(附下载)
  3. Assembly配置
  4. FFMpeg.AutoGen+D2D解码并播放视频(含音频流)
  5. 小程序插入激励视频广告例子
  6. html5 colgroup标签,htmlcolgroup标签的使用与定义
  7. lk 编译后emmc_appsboot.mbn未更新原因
  8. # 项目一:‍‍‍STM32+串口DMA+RS485+MODBUS+传感器实现SO2的测试
  9. QQ for Linux(Ubuntu安装QQ)
  10. scrollTop是什么及用法说明