引言:
开发者在处理异常事,直接抛出异常即可,代码自动处理返回前端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