springboot+国际化+全局异常处理

引言:
开发者在处理异常事,直接抛出异常即可,代码自动处理返回前端json,以及日志记录;此种方案大大减轻了开发者在工作中对异常的处理和日志记录;
下面全套代码展示
1.yml配置

spring:
  messages:
    basename: i18n/errormessage
    encoding: utf-8
  http:
    encoding:
      force: true
      charset: UTF-8
      enabled: true

2.加载国际化资源文件

@Component
public class MessageSourceUtils {
    private String baseName = "i18n/errormessage";
    private String encoding = "UTF-8";
    private static MessageSource messageSource;


    private ReloadableResourceBundleMessageSource bundleMessageSource = new ReloadableResourceBundleMessageSource();
    // 容器初始化时加载该代码
    @PostConstruct
    public void initMessageSource() {
        bundleMessageSource.setBasenames(baseName);
        bundleMessageSource.setDefaultEncoding(encoding);
        setMessageSource(bundleMessageSource);
        messageSource = bundleMessageSource;
    }

    public static String getMessage(String key) {
    // 通过国际化文件的key获取值
        return messageSource.getMessage(key, null, LanguageUtils.getLocale());
    }
}

3.全局异常处理类

@RestControllerAdvice
public class SteamCatExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(SteamCatException.class);
    @ExceptionHandler(value = Exception.class)
    public ResultEntity<SteamCatException> exceptionHandler(Exception exception) {
        if (exception instanceof SteamCatException) {
        // 自定义异常处理
            SteamCatException steamCatException = (SteamCatException) exception;
            String errorMessage = MessageSourceUtils.getMessage(steamCatException.getErrorCode());
            logger.error("error code:{}, error message:{}", steamCatException.getErrorCode(), errorMessage);
            steamCatException.setErrorMessage(errorMessage);
            return ResultEntity.fail(steamCatException.getErrorCode(), steamCatException.getErrorMessage());
        } else {
        // 通用异常处理
            return ResultEntity.fail(ErrorConst.ERROR_CODE, ErrorConst.ERROR_MESSAGE);
        }
    }
}

4.语言工具类编写

public class LanguageUtils {
    private static String language;
    private static String country;

    public static void setLanguage(String language) {
        LanguageUtils.language = language;
        LanguageUtils.country = getCountry();
    }

    private static String getCountry() {
        return "en".equals(language) ? "US" : "CN";
    }

    public static Locale getLocale() {
        return new Locale(language, country);
    }
}

5.过滤器获取cookie中的语言类型

public class LanguageFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入过滤器");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        Cookie[] cookies = request.getCookies();
        String language = "zh";
        for (Cookie cookie : cookies) {
            if ("language".equals(cookie.getName())) {
                language = cookie.getValue();
            }
        }
        LanguageUtils.setLanguage(language);
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

6.过滤器注册

@Configuration
public class WebFilterConfig {
    @Bean
    public FilterRegistrationBean LanguageRegistration() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new LanguageFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

7.测试controller

@RestController
@RequestMapping("/test")
public class SteamController {
    @GetMapping("/testException")
    public ResultEntity testException(BindUserParam bindUserParam) {
        try {
            System.out.println(3/0);
        }catch (Exception ex) {
            throw new SteamCatException("com.test.0001");
        }
        return ResultEntity.success("a");
    }
}

返回前端效果

{
	"status":false,
	"message":"fail",
	"data":{
		"errorMessage":"未知错误",
		"errorCode":"com.test.0001"
		}
}

觉得不错请关注,记录日后工作中较好的代码;解决遇到的bug

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干饭两斤半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值