1、新增system服务国际化配置文件;2、资金管理请求校验国际化;3、全局异常GlobalError增加国际化提示;

This commit is contained in:
gaoqr
2025-11-19 10:45:15 +08:00
parent 4452029813
commit d294b73d81
48 changed files with 661 additions and 174 deletions
@@ -2,6 +2,7 @@ package com.cf.imes.framework.web.config;
import com.cf.imes.framework.aop.ControllerResolver;
import com.cf.imes.framework.common.enums.WebFilterOrderEnum;
import com.cf.imes.framework.common.util.i18n.core.util.I18nUtils;
import com.cf.imes.framework.web.core.filter.CacheRequestBodyFilter;
import com.cf.imes.framework.web.core.filter.DataSourceFilter;
import com.cf.imes.framework.web.core.handler.GlobalExceptionHandler;
@@ -15,6 +16,7 @@ import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfigu
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.bind.annotation.RestController;
@@ -59,7 +61,12 @@ public class ChenfengWebAutoConfiguration implements WebMvcConfigurer {
}
@Bean
public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogApi apiErrorLogApi) {
public I18nUtils i18nUtils(MessageSource messageSource) {
return new I18nUtils(messageSource);
}
@Bean
public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogApi apiErrorLogApi, I18nUtils i18nUtils) {
return new GlobalExceptionHandler(applicationName, apiErrorLogApi);
}
@@ -11,7 +11,6 @@ import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.servlet.ServletUtils;
import com.cf.imes.module.infra.api.logger.ApiErrorLogApi;
import com.cf.imes.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -33,12 +32,9 @@ import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.ValidationException;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants.*;
@@ -109,7 +105,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(value = MissingServletRequestParameterException.class)
public CommonResult missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException ex) {
log.warn(String.format("==========[missingServletRequestParameterExceptionHandler]==========%s", ex.getMessage()));
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数缺失:%s", ex.getParameterName()));
return CommonResult.error(REQUEST_PARAM_MISSING, ex.getParameterName());
}
/**
@@ -120,7 +116,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public CommonResult methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) {
log.warn(String.format("==========[missingServletRequestParameterExceptionHandler]==========%s", ex.getMessage()));
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误,%s:%s", ex.getName(), ex.getValue()));
return CommonResult.error(REQUEST_PARAM_TYPE_ERROR, ex.getName() + ":" + ex.getValue());
}
/**
@@ -147,7 +143,7 @@ public class GlobalExceptionHandler {
if (CharSequenceUtil.isNotEmpty(defaultMessage) && fieldError.contains(ConstraintViolation.class)) {
return CommonResult.error(BAD_REQUEST.getCode(), defaultMessage);
} else {
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确,%s:%s", fieldError.getField(), fieldError.getRejectedValue()));
return CommonResult.error(BAD_REQUEST, fieldError.getField() + ":" + fieldError.getRejectedValue());
}
}
@@ -162,7 +158,7 @@ public class GlobalExceptionHandler {
if (StringUtils.isNotEmpty(message)) {
return CommonResult.error(BAD_REQUEST.getCode(), message);
} else {
return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", message));
return CommonResult.error(BAD_REQUEST, message);
}
}
@@ -186,7 +182,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(NoHandlerFoundException.class)
public CommonResult noHandlerFoundExceptionHandler(NoHandlerFoundException ex) {
log.warn(String.format("==========[noHandlerFoundExceptionHandler]==========%s", ex.getMessage()));
return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL()));
return CommonResult.error(NOT_FOUND, ex.getRequestURL());
}
/**
@@ -197,7 +193,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public CommonResult httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException ex) {
log.warn(String.format("==========[httpRequestMethodNotSupportedExceptionHandler]==========%s", ex.getMessage()));
return CommonResult.error(METHOD_NOT_ALLOWED.getCode(), String.format("请求方法不正确:%s", ex.getMessage()));
return CommonResult.error(METHOD_NOT_ALLOWED, ex.getMessage());
}
/**
@@ -223,25 +219,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(value = HttpMessageNotReadableException.class)
public CommonResult httpMessageNotReadableExceptionHandler(HttpServletRequest req, HttpMessageNotReadableException ex) {
log.warn(String.format("==========[httpMessageNotReadableExceptionHandler]==========%s", ex.getMessage()));
Throwable rootCause = ex.getRootCause();
// 无效格式异常处理。
if (rootCause instanceof InvalidFormatException) { // MismatchedInputException
InvalidFormatException e = (InvalidFormatException) rootCause;
return CommonResult.error(BAD_REQUEST.getCode(), String.format("参数校验失败:'%s' 格式出错", e.getValue()));
}
// 文件格式错误处理
if (rootCause instanceof IOException) {
// 使用正则提取数值
Pattern pattern = Pattern.compile("Numeric value \\(([-+]?\\d*\\.?\\d+(?:[eE][-+]?\\d+)?)\\) out of range");
Matcher matcher = pattern.matcher(rootCause.getMessage());
if (matcher.find()) {
String invalidValue = matcher.group(1);
return CommonResult.error(BAD_REQUEST.getCode(), String.format("参数校验失败:'%s' 超出范围", invalidValue));
}
}
return CommonResult.error(BAD_REQUEST.getCode(), "请求参数不合法");
return CommonResult.error(BAD_REQUEST);
}
/**
@@ -269,7 +247,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(value = DuplicateKeyException.class)
public CommonResult duplicateKeyExceptionHandler(DuplicateKeyException ex) {
log.warn(String.format("==========[duplicateKeyExceptionHandler]==========%s", ex.getMessage()));
return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), "请求数据已存在,请检查");
return CommonResult.error(DUPLICATE_DATA_ERROR);
}
/**
@@ -293,7 +271,7 @@ public class GlobalExceptionHandler {
// 插入异常日志
this.createExceptionLog(req, ex);
// 返回 ERROR CommonResult
return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg());
return CommonResult.error(INTERNAL_SERVER_ERROR);
}
private void createExceptionLog(HttpServletRequest req, Throwable e) {
@@ -3,6 +3,9 @@ package com.cf.imes.framework.web.core.handler;
import com.cf.imes.framework.apilog.core.filter.ApiAccessLogFilter;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.web.core.util.WebFrameworkUtils;
import jakarta.annotation.Resource;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
@@ -24,6 +27,9 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice
public class GlobalResponseBodyHandler implements ResponseBodyAdvice {
@Resource
private MessageSource messageSource;
@Override
@SuppressWarnings("NullableProblems") // 避免 IDEA 警告
public boolean supports(MethodParameter returnType, Class converterType) {
@@ -38,6 +44,14 @@ public class GlobalResponseBodyHandler implements ResponseBodyAdvice {
@SuppressWarnings("NullableProblems") // 避免 IDEA 警告
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof CommonResult) {
CommonResult<?> res = (CommonResult<?>) body;
if (!res.isSuccess()) {
String key = res.getMsg();
String i18nMsg = messageSource.getMessage(key, res.getArgs(), key, LocaleContextHolder.getLocale());
res.setMsg(i18nMsg);
}
}
// 记录 Controller 结果
WebFrameworkUtils.setCommonResult(((ServletServerHttpRequest) request).getServletRequest(), (CommonResult<?>) body);
return body;