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

相关文章

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事