SpringBoot2 国际化最佳实践

2024-05-13 16:48

本文主要是介绍SpringBoot2 国际化最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一般情况下确实对应不到国际化, 但是无奈老板说, 我们要做国际化, 作为boss  drive  develop 的一员, 还能有啥办法, 我也很绝望啊.,那就做呗.

其实很简单, 这里就以我们抛出的异常进行封装, 在英文和中文环境下两套不同的错误.

1. 新建项目

2.在resources 文件夹下建立 i18n文件夹, 放错误信息.

新建文件   error_zh_CN.properties   放置中文错误信息

新建文件  error_en_US.properties   放置中文错误信息

 

3. 新建配置类:

package com.curefun.core.config;import java.util.Locale;
import java.util.ResourceBundle;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.i18n.LocaleContextHolder;/** 错误码文本获取* 在项目resources目录下新建i18n文件夹,错误码文本按语言类型划分文件,使用error开头,后跟语言编码,如error_zh_cn.properties,error_en_us.properties*/
@PropertySource(value = { "classpath:i18n/error*.properties" })
public class ErrorCodeMessage {private static ConcurrentHashMap<String, ResourceBundle> messages = new ConcurrentHashMap<String, ResourceBundle>();/*** 获取错误码文本* @param key 错误码编码,如“10000”* @param params String.format()占位符对应文本* @return*/public static String getMessage(String key, Object... params) {// 获取语言,这个语言是从header中的Accept-Language中获取的,// 会根据Accept-Language的值生成符合规则的locale,如zh、pt、en等Locale locale = LocaleContextHolder.getLocale();ResourceBundle message = messages.get(locale.getLanguage());if (null == message) {synchronized (messages) {// 在这里读取配置信息message = messages.get(locale.getLanguage());if (null == message) {message = ResourceBundle.getBundle("i18n/error", locale);messages.put(locale.getLanguage() + "_" + locale.getCountry(), message);}}}// 此处获取并返回messageif (null != params) {return String.format(message.getString(key), params);}return message.getString(key);}/*** 清空错误文本缓存map*/public static void flushMessage() {messages.clear();}
}

这里进行配置的加载, 进行信息的缓存,

 

 

在业务代码中只需要很简单的抛出异常就好了

public class BusinessException extends  RuntimeException {private String code;public BusinessException(String code) {super(ErrorCodeMessage.getMessage(code));this.code = code;}public BusinessException(String code, Object ...msgError) {super(ErrorCodeMessage.getMessage(code,msgError));this.code = code;}public String getCode() {return this.code;}}

 

最后一步, 定义一个全局的异常处理器

 

import com.alibaba.fastjson.JSONObject;
import com.curefun.core.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @author zk* @Description: 全局异常处理* @date 2019年10月29日15:08:35*/
@Slf4j
@RestControllerAdvice
public class ExceptionHandleController {/*** 处理参数异常** @param ex*/@ExceptionHandler(BusinessException.class)public JSONObject handleParamException(BusinessException ex) {JSONObject obj = new JSONObject();obj.put("code", ex.getCode());String message = ex.getMessage();obj.put("msg", message);obj.put("data", "");log.error("发生异常:{}",ex);return obj;}/*** 处理参数缺失异常** @param ex*/@ExceptionHandler(MissingServletRequestParameterException.class)public JSONObject handleMissParamException(BusinessException ex) {JSONObject obj = new JSONObject();obj.put("code", 15000);obj.put("msg", "缺少参数");obj.put("data", "缺少参数");log.error("发生异常:{}",ex);return obj;}@ExceptionHandler(Exception.class)public JSONObject handleException(Exception ex) {JSONObject obj = new JSONObject();obj.put("code", "15000");obj.put("msg", "服务内部错误");obj.put("data", "");ex.printStackTrace();log.error("发生异常:{}",ex.getCause());return obj;}}

好像我又水了一篇文章,  哈哈哈 ,  真容易,  果然花了5分钟写的文章 , 大概率是很水的文章.  凑合看下,  非常简单的总结

这篇关于SpringBoot2 国际化最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986273

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅