Support internationalization

This commit is contained in:
JiaJu Zhuang
2023-06-22 20:31:19 +08:00
parent e67d3dae54
commit bbca928289
59 changed files with 563 additions and 603 deletions

View File

@ -1,18 +0,0 @@
package ai.chat2db.server.web.api.aspect;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author moji
* @version BusinessExceptionAspect.java, v 0.1 2022年10月10日 14:44 moji Exp $
* @date 2022/10/10
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface BusinessExceptionAspect {
}

View File

@ -1,107 +0,0 @@
package ai.chat2db.server.web.api.aspect;
import java.util.Locale;
import com.alibaba.fastjson2.JSON;
import ai.chat2db.server.tools.base.excption.BusinessException;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.base.wrapper.Result;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* @author moji
* @version BusinessExceptionHandler.java, v 0.1 2022年10月10日 14:45 moji Exp $
* @date 2022/10/10
*/
@Component
@Aspect
@Slf4j
public class BusinessExceptionHandler {
@Autowired
private MessageSource messageSource;
@Autowired
private HttpServletRequest httpServletRequest;
private static final String LOCALE_HEADER = "Accept-Language";
@Around("within(@ai.chat2db.server.web.api.aspect.BusinessExceptionAspect *)")
public Object businessExceptionHandler(ProceedingJoinPoint proceedingJoinPoint) {
try {
String method = proceedingJoinPoint.getSignature().getDeclaringTypeName() + proceedingJoinPoint
.getSignature().getName();
long s1 = System.currentTimeMillis();
log.info("proceed begin:{} ,param:{}", method, JSON.toJSONString(proceedingJoinPoint.getArgs()));
Object result = proceedingJoinPoint.proceed();
long cost = System.currentTimeMillis() - s1;
log.info("proceed end:{}, result:{}, cost:{}", method, JSON.toJSONString(result), cost);
return result;
} catch (Throwable t) {
log.error("invoke method {} error: {}.", proceedingJoinPoint.getSignature().getName(),
JSON.toJSONString(proceedingJoinPoint.getArgs()), t);
if (t instanceof BusinessException) {
BusinessException exception = (BusinessException)t;
String message = getMessage(exception.getCode(), exception.getMessage());
return error(proceedingJoinPoint, exception.getCode(), message);
}
String message = getMessage(CommonErrorEnum.COMMON_SYSTEM_ERROR.name(), t.getMessage());
return error(proceedingJoinPoint, CommonErrorEnum.COMMON_SYSTEM_ERROR.name(), message);
}
}
private Object error(ProceedingJoinPoint proceedingJoinPoint, String errorCode, String errorMessage) {
try {
Signature signature = proceedingJoinPoint.getSignature();
Class<?> returnType = ((MethodSignature)signature).getReturnType();
Object resultInstance = returnType.newInstance();
Result<Object> result = (Result<Object>)resultInstance;
result.success(false);
result.errorCode(errorCode);
result.errorMessage(errorMessage);
return result;
} catch (Exception e) {
log.error("invalid return type!", e);
Object resultInstance = new Object();
Result<Object> result = (Result<Object>)resultInstance;
result.success(false);
result.errorCode(CommonErrorEnum.COMMON_SYSTEM_ERROR.name());
result.errorMessage(e.getMessage());
return result;
}
}
/**
* get i18n message
*
* @param code
* @param message
* @return
*/
private String getMessage(String code, String message) {
try {
HttpServletRequest servletRequest
= ((ServletRequestAttributes)(RequestContextHolder.currentRequestAttributes())).getRequest();
Locale locale = servletRequest.getHeaders(LOCALE_HEADER).hasMoreElements() ?
new Locale(servletRequest.getHeaders(LOCALE_HEADER).nextElement()) : Locale.CHINA;
return messageSource.getMessage(code,
null, message, locale);
} catch (Exception exception) {
log.error("get i18n message error", exception);
}
return code;
}
}

View File

@ -7,11 +7,13 @@ package ai.chat2db.server.web.api.controller;
import ai.chat2db.server.domain.support.sql.SSHManager;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.common.config.AliDbhubProperties;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -31,6 +33,8 @@ public class SystemController {
@Autowired
private AliDbhubProperties aliDbhubProperties;
@Resource
private MessageSource messageSource;
/**
* 检测是否成功
@ -39,6 +43,11 @@ public class SystemController {
*/
@GetMapping
public DataResult<String> get() {
log.info("locale:{}", LocaleContextHolder.getLocale());
log.info("error message:{}",
messageSource.getMessage("COMMON_SYSTEM_ERROR", null, LocaleContextHolder.getLocale()));
log.info("error message:{}",
messageSource.getMessage("COMMON_SYSTEM_ERROR2", null, LocaleContextHolder.getLocale()));
return DataResult.of("success");
}

View File

@ -18,9 +18,8 @@ import ai.chat2db.server.domain.api.service.DataSourceService;
import ai.chat2db.server.domain.api.service.TableService;
import ai.chat2db.server.domain.support.enums.DbTypeEnum;
import ai.chat2db.server.domain.support.model.TableColumn;
import ai.chat2db.server.tools.base.excption.BusinessException;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
import ai.chat2db.server.tools.common.util.EasyEnumUtils;
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
import ai.chat2db.server.web.api.controller.ai.config.LocalCache;
@ -34,7 +33,6 @@ import ai.chat2db.server.web.api.controller.ai.request.ChatRequest;
import ai.chat2db.server.web.api.controller.ai.rest.client.RestAIClient;
import ai.chat2db.server.web.api.util.ApplicationContextUtil;
import ai.chat2db.server.web.api.util.OpenAIClient;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
@ -202,12 +200,12 @@ public class ChatController {
SseEmitter sseEmitter = new SseEmitter(CHAT_TIMEOUT);
String uid = headers.get("uid");
if (StrUtil.isBlank(uid)) {
throw new BusinessException(CommonErrorEnum.COMMON_SYSTEM_ERROR);
throw new ParamBusinessException("uid");
}
//提示消息不得为空
if (StringUtils.isBlank(queryRequest.getMessage())) {
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException("message");
}
if (useOpenAI()) {
@ -258,7 +256,7 @@ public class ChatController {
if (prompt.length() / TOKEN_CONVERT_CHAR_LENGTH > MAX_PROMPT_LENGTH) {
log.error("提示语超出最大长度:{},输入长度:{}, 请重新输入", MAX_PROMPT_LENGTH,
prompt.length() / TOKEN_CONVERT_CHAR_LENGTH);
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException();
}
GptVersionType modelType = EasyEnumUtils.getEnum(GptVersionType.class, gptVersion);

View File

@ -4,10 +4,8 @@ import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import ai.chat2db.server.tools.base.excption.BusinessException;
import ai.chat2db.server.tools.base.excption.CommonErrorEnum;
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
import ai.chat2db.server.web.api.controller.ai.rest.model.RestAiCompletion;
import cn.hutool.http.ContentType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.unfbx.chatgpt.sse.ConsoleEventSourceListener;
@ -25,7 +23,6 @@ import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import okhttp3.sse.EventSources;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
/**
* 自定义AI接口client
@ -96,11 +93,11 @@ public class RestAiStreamClient {
public void streamCompletions(RestAiCompletion completion, EventSourceListener eventSourceListener) {
if (Objects.isNull(eventSourceListener)) {
log.error("参数异常EventSourceListener不能为空");
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException();
}
if (StringUtils.isBlank(completion.getPrompt())) {
log.error("参数异常Prompt不能为空");
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException();
}
try {
EventSource.Factory factory = EventSources.createFactory(this.okHttpClient);
@ -114,7 +111,7 @@ public class RestAiStreamClient {
EventSource eventSource = factory.newEventSource(request, eventSourceListener);
} catch (Exception e) {
log.error("请求参数解析异常", e);
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException();
}
}
@ -127,7 +124,7 @@ public class RestAiStreamClient {
public void nonStreamCompletions(RestAiCompletion completion, EventSourceListener eventSourceListener) {
if (StringUtils.isBlank(completion.getPrompt())) {
log.error("参数异常Prompt不能为空");
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException();
}
try {
ObjectMapper mapper = new ObjectMapper();
@ -159,7 +156,7 @@ public class RestAiStreamClient {
} catch (Exception e) {
log.error("请求参数解析异常", e);
throw new BusinessException(CommonErrorEnum.PARAM_ERROR);
throw new ParamBusinessException();
}
}

View File

@ -13,7 +13,6 @@ import ai.chat2db.server.domain.api.param.SystemConfigParam;
import ai.chat2db.server.domain.api.service.ConfigService;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
import ai.chat2db.server.web.api.controller.config.request.ChatGptSystemConfigRequest;
import ai.chat2db.server.web.api.controller.config.request.SystemConfigRequest;
@ -33,7 +32,6 @@ import org.springframework.web.bind.annotation.RestController;
* @author jipengfei
* @version : ConfigController.java
*/
@BusinessExceptionAspect
@ConnectionInfoAspect
@RequestMapping("/api/config")
@RestController

View File

@ -9,7 +9,6 @@ import ai.chat2db.server.domain.api.service.ChartService;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.dashboard.converter.ChartWebConverter;
import ai.chat2db.server.web.api.controller.dashboard.request.ChartCreateRequest;
import ai.chat2db.server.web.api.controller.dashboard.request.ChartQueryRequest;
@ -33,7 +32,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version ChartController.java, v 0.1 2022年09月18日 10:55 moji Exp $
* @date 2022/09/18
*/
@BusinessExceptionAspect
@RequestMapping("/api/chart")
@RestController
public class ChartController {

View File

@ -11,7 +11,6 @@ import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.dashboard.converter.DashboardWebConverter;
import ai.chat2db.server.web.api.controller.dashboard.request.DashboardCreateRequest;
import ai.chat2db.server.web.api.controller.dashboard.request.DashboardUpdateRequest;
@ -34,7 +33,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version DashboardController.java, v 0.1 2022年09月18日 10:55 moji Exp $
* @date 2022/09/18
*/
@BusinessExceptionAspect
@RequestMapping("/api/dashboard")
@RestController
public class DashboardController {

View File

@ -19,7 +19,6 @@ import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
import ai.chat2db.server.web.api.controller.data.source.converter.DataSourceWebConverter;
import ai.chat2db.server.web.api.controller.data.source.converter.SSHWebConverter;
@ -56,7 +55,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version ConnectionController.java, v 0.1 2022年09月16日 14:07 moji Exp $
* @date 2022/09/16
*/
@BusinessExceptionAspect
@ConnectionInfoAspect
@RequestMapping("/api/connection")
@RestController

View File

@ -6,7 +6,6 @@ import java.util.stream.Collectors;
import ai.chat2db.server.tools.base.enums.EnvTypeEnum;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.data.source.vo.EnvVO;
import org.springframework.web.bind.annotation.GetMapping;
@ -20,7 +19,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version EnvController.java, v 0.1 2022年09月18日 14:04 moji Exp $
* @date 2022/09/18
*/
@BusinessExceptionAspect
@RequestMapping("/api/env")
@RestController
public class EnvController {

View File

@ -9,7 +9,6 @@ import ai.chat2db.server.domain.api.service.OperationLogService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.operation.log.converter.OperationLogWebConverter;
import ai.chat2db.server.web.api.controller.operation.log.request.OperationLogCreateRequest;
import ai.chat2db.server.web.api.controller.operation.log.request.OperationLogQueryRequest;
@ -29,7 +28,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version HistoryManageController.java, v 0.1 2022年09月18日 10:55 moji Exp $
* @date 2022/09/18
*/
@BusinessExceptionAspect
@RequestMapping("/api/operation/log")
@RestController
public class OperationLogController {

View File

@ -11,7 +11,6 @@ import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.operation.saved.converter.OperationWebConverter;
import ai.chat2db.server.web.api.controller.operation.saved.request.OperationCreateRequest;
import ai.chat2db.server.web.api.controller.operation.saved.request.OperationQueryRequest;
@ -35,7 +34,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version DdlManageController.java, v 0.1 2022年09月16日 19:59 moji Exp $
* @date 2022/09/16
*/
@BusinessExceptionAspect
@RequestMapping("/api/operation/saved")
@RestController
public class OperationSavedController {

View File

@ -22,7 +22,6 @@ import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter;
@ -56,7 +55,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version MysqlTableManageController.java, v 0.1 2022年09月16日 17:41 moji Exp $
* @date 2022/09/16
*/
@BusinessExceptionAspect
@ConnectionInfoAspect
@RequestMapping("/api/rdb/ddl")
@RestController

View File

@ -8,7 +8,6 @@ import ai.chat2db.server.domain.support.model.ExecuteResult;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect;
import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter;
import ai.chat2db.server.web.api.controller.rdb.request.DataExportRequest;
@ -30,7 +29,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version MysqlDataManageController.java, v 0.1 2022年09月16日 17:37 moji Exp $
* @date 2022/09/16
*/
@BusinessExceptionAspect
@ConnectionInfoAspect
@RequestMapping("/api/rdb/dml")
@RestController

View File

@ -2,7 +2,6 @@ package ai.chat2db.server.web.api.controller.redis;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.redis.request.KeyCreateRequest;
import ai.chat2db.server.web.api.controller.redis.request.KeyDeleteRequest;
import ai.chat2db.server.web.api.controller.redis.request.KeyQueryRequest;
@ -24,7 +23,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version MysqlTableManageController.java, v 0.1 2022年09月16日 17:41 moji Exp $
* @date 2022/09/16
*/
@BusinessExceptionAspect
@RequestMapping("/api/redis/key")
@RestController
public class RedisKeyManageController {

View File

@ -2,7 +2,6 @@ package ai.chat2db.server.web.api.controller.redis;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.redis.request.KeyQueryRequest;
import ai.chat2db.server.web.api.controller.redis.request.KeyValueManageRequest;
import ai.chat2db.server.web.api.controller.redis.request.ValueUpdateRequest;
@ -21,7 +20,6 @@ import org.springframework.web.bind.annotation.RestController;
* @version MysqlDataManageController.java, v 0.1 2022年09月16日 17:37 moji Exp $
* @date 2022/09/16
*/
@BusinessExceptionAspect
@RequestMapping("/api/redis/kv")
@RestController
public class RedisKeyValueManageController {

View File

@ -11,7 +11,6 @@ import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.web.api.aspect.BusinessExceptionAspect;
import ai.chat2db.server.web.api.controller.user.converter.UserWebConverter;
import ai.chat2db.server.web.api.controller.user.request.UserCreateRequest;
import ai.chat2db.server.web.api.controller.user.request.UserQueryRequest;
@ -32,7 +31,6 @@ import org.springframework.web.bind.annotation.RestController;
* @author jipengfei
* @version : UserController.java
*/
@BusinessExceptionAspect
@RequestMapping("/api/user")
@RestController
public class UserController {