当前位置: 首页 > news >正文

SpringBoot错误码国际化

先看测试效果: 

f7d7139e9f424832bcfdc5ee3863e0cb.png

130cff648d04407f8596fc3fa198e4ee.png

 374f7511d19047e999d8f22c9594cb39.png

60cb9ee209844d978fd20651436d7ee7.png

文件结构 

1b9d1f77e3c2465a92b8242e614ff7df.png

f8383146592c4740b0bb8fb910013b40.png

1.中文和英文的错误消息配置

bfd2cba4de2e4c4e987e3dbbc343d3aa.png

package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/
@Getter
public enum ExceptionEnum {//# code命名规则:模块编码 + 唯一序号 11表示用户管理模块LOGIN_EXCEPTION(1101),OTHER_EXCEPTION(1102);private Integer code;ExceptionEnum(Integer code) {this.code = code;}
}

2.统一响应类 

package com.ldj.mybatisflex.common;import lombok.Getter;
import lombok.Setter;
import org.springframework.context.i18n.LocaleContextHolder;import java.util.ResourceBundle;/*** User: ldj* Date: 2025/1/12* Time: 18:08* Description: 统一响应类*/
@Getter
@Setter
public class Response<T> {private static final String basePath = "i18n/message";private static final Integer successCode = 200;private static final String success = "成功!";private static final Integer failCode = 500;private static final String fail = "失败!";private Integer code;private String message;private T data;public static <T>Response<T> success(T data) {Response<T> response = new Response<>();response.setCode(200);response.setMessage(success);response.setData(data);return response;}public static <T>Response<T> fail() {return fail(failCode, fail);}//关键代码是读取国际化的配置文件,作为错误提示消息public static <T>Response<T> fail(ExceptionEnum exceptionEnum, T date) {Response<T> response = new Response<>();response.setCode(exceptionEnum.getCode());ResourceBundle bundle = ResourceBundle.getBundle(basePath, LocaleContextHolder.getLocale());String message = bundle.getString(exceptionEnum.getCode().toString());response.setMessage(message);response.setData(date);return response;}public static <T>Response<T> fail(Integer code, String message) {Response<T> response = new Response<>();response.setCode(code);response.setMessage(message);response.setData(null);return response;}
}

 3.登录拦截器

package com.ldj.mybatisflex.interceptor;import org.springframework.context.i18n.LocaleContext;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.i18n.SimpleLocaleContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;/*** User: ldj* Date: 2025/1/12* Time: 21:05* Description: 登录拦截器*/
@Order(1)
@Component
public class LoginUserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//需要前端传过来的,这里一直是nullString language = request.getHeader("language");//假设前端传"en_US"//language = "en_US";//默认是zh_CNif (language == null || "".equals(language) || "zh_CN".equalsIgnoreCase(language)) {LocaleContext localeContext = new SimpleLocaleContext(Locale.SIMPLIFIED_CHINESE);LocaleContextHolder.setLocaleContext(localeContext);}else {LocaleContext localeContext = new SimpleLocaleContext(Locale.US);LocaleContextHolder.setLocaleContext(localeContext);}System.out.println("配置语言:" + LocaleContextHolder.getLocale());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//请求结束后记得清理 ThreadLocal里面的值,好让垃圾回收器回收LocaleContextHolder.resetLocaleContext();}
}

 4.配置webmvc 应用登录拦截器

package com.ldj.mybatisflex.config;import com.ldj.mybatisflex.interceptor.LoginUserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** User: ldj* Date: 2025/1/12* Time: 21:00* Description: No Description*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginUserInterceptor loginUserInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginUserInterceptor);}
}

5.测试

package com.ldj.mybatisflex.controller;import com.ldj.mybatisflex.common.ExceptionEnum;
import com.ldj.mybatisflex.common.Response;
import com.ldj.mybatisflex.model.dao.UerInfoDAO;
import com.ldj.mybatisflex.model.dto.UserLoginReqDTO;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;/*** User: ldj* Date: 2024/11/17* Time: 16:55* Description: No Description*/
@RestController
@RequestMapping("/userInfo")
@CrossOrigin(maxAge = 3600)
public class UserInfoController {@PostMapping(value = "/login")public Response<UerInfoDAO> login(@RequestBody @Valid UserLoginReqDTO userLoginReqDTO){return Response.fail(ExceptionEnum.LOGIN_EXCEPTION, null);}
}

总结,这有个问题,每次读取配置文件都要操作io流,性能比直接定义在枚举差,3个字段,一个code ,1个cnMsg  ,1个enMsg,再写个方法判断是否中,英获取消息。

但是如果是法语,就失去灵活性,要改代码

 

http://www.lryc.cn/news/521759.html

相关文章:

  • LeetCode 3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间
  • 深度学习中的模块复用原则(定义一次还是多次)
  • Mac——Cpolar内网穿透实战
  • 安全测评主要标准
  • qBittorent访问webui时提示unauthorized解决方法
  • 504 Gateway Timeout:网关超时解决方法
  • Vue 实现当前页面刷新的几种方法
  • MCP Server开发的入门教程(python和pip)
  • 手撕Transformer -- Day7 -- Decoder
  • C#异步和多线程,Thread,Task和async/await关键字--12
  • 使用分割 Mask 和 K-means 聚类获取天空的颜色
  • 145.《redis原生超详细使用》
  • Pytorch基础教程:从零实现手写数字分类
  • 【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统
  • excel仅复制可见单元格,仅复制筛选后内容
  • HBASE学习(一)
  • element select 绑定一个对象{}
  • Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器
  • C:JSON-C简介
  • 业务幂等性技术架构体系之消息幂等深入剖析
  • 【Go】Go Gin框架初识(一)
  • 2024年合肥市科普日小学组市赛第一题题解
  • 【MySQL实战】mysql_exporter+Prometheus+Grafana
  • Wireshark 使用教程:网络分析从入门到精通
  • 如何在前端给视频进行去除绿幕并替换背景?-----Vue3!!
  • 使用中间件自动化部署java应用
  • pytorch张量分块投影示例代码
  • Visual Studio 同一解决方案 同时运行 多个项目
  • VMware中Ubuntu如何连接网络?安排!
  • 使用 Charles 调试 Flutter 应用中的 Dio 网络请求