From 7aa1568fe858de82c3c0e0d5de8e11dae32c0aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Sat, 8 Feb 2025 11:08:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(REQ-3600):=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BA=BA=E5=91=98=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=A0=B9=E6=8D=AEworkspaceId=E8=BF=9B=E8=A1=8C=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景: 之前只支持通过thirdProjectId进行查询,但业务侧并没有这个信息。 --- .../client/req/ListThirdProjectPeopleReq.java | 17 +++++++++++++++-- .../controller/ThirdPartPersonController.java | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java b/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java index 17f10c6..2c5f478 100644 --- a/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java +++ b/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java @@ -1,9 +1,11 @@ package cn.axzo.riven.client.req; +import cn.axzo.framework.domain.ServiceException; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; import javax.validation.constraints.NotBlank; import java.io.Serializable; @@ -21,10 +23,15 @@ public class ListThirdProjectPeopleReq implements Serializable { @NotBlank(message = "thirdCode不能为空") private String thirdCode; /** - * '三方项目编号' + * '三方项目编号' 此值 和workspaceId 不能都为空 */ - @NotBlank(message = "thirdProjectId不能为空") +// @NotBlank(message = "thirdProjectId不能为空") private String thirdProjectId; + + /** + * workspaceId 。此值 和 三方项目编号,不能都为空 + */ + private Long workspaceId; /** * 三方人员唯一ID */ @@ -36,4 +43,10 @@ public class ListThirdProjectPeopleReq implements Serializable { private Set personIds; private Boolean needThirdPerson; + + public void check() { + if (StringUtils.isBlank(thirdProjectId) && workspaceId == null) { + throw new ServiceException("workspaceId 和 thirdProjectId 不能都为空"); + } + } } diff --git a/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java b/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java index 31c453d..64d4ebc 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java @@ -52,8 +52,10 @@ public class ThirdPartPersonController implements ThirdPartPersonApi { @Override public ApiResult> listThirdProjectPeople(ListThirdProjectPeopleReq param) { + param.check(); ThirdProject thirdProject = thirdProjectDao.lambdaQuery().eq(ThirdProject::getThirdCode, param.getThirdCode()) - .eq(ThirdProject::getThirdProjectId, param.getThirdProjectId()) + .eq(StrUtil.isNotBlank(param.getThirdProjectId()), ThirdProject::getThirdProjectId, param.getThirdProjectId()) + .apply(param.getWorkspaceId() != null, " extra -> '$.workspaceId' = {0} ", param.getWorkspaceId()) .eq(ThirdProject::getIsDelete, TableIsDeleteEnum.NORMAL.value) .one(); if (thirdProject == null){ From df3b1f14a5b79d0206d3d25572689d4faa4b63f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Sat, 8 Feb 2025 13:48:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(REQ-3600):=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BA=BA=E5=91=98=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=A0=B9=E6=8D=AEworkspaceId=E8=BF=9B=E8=A1=8C=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E3=80=82=20step2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/req/ListThirdProjectPeopleReq.java | 3 +- .../exception/ExceptionAdviceHandler.java | 252 ++++++++++++++++++ .../src/main/resources/logback-spring.xml | 2 +- .../controller/ThirdPartPersonController.java | 6 +- 4 files changed, 257 insertions(+), 6 deletions(-) create mode 100644 riven-server/src/main/java/cn/axzo/riven/config/exception/ExceptionAdviceHandler.java diff --git a/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java b/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java index 2c5f478..1c2eb48 100644 --- a/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java +++ b/riven-api/src/main/java/cn/axzo/riven/client/req/ListThirdProjectPeopleReq.java @@ -1,6 +1,5 @@ package cn.axzo.riven.client.req; -import cn.axzo.framework.domain.ServiceException; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -46,7 +45,7 @@ public class ListThirdProjectPeopleReq implements Serializable { public void check() { if (StringUtils.isBlank(thirdProjectId) && workspaceId == null) { - throw new ServiceException("workspaceId 和 thirdProjectId 不能都为空"); + throw new IllegalArgumentException("workspaceId 和 thirdProjectId 不能都为空"); } } } diff --git a/riven-server/src/main/java/cn/axzo/riven/config/exception/ExceptionAdviceHandler.java b/riven-server/src/main/java/cn/axzo/riven/config/exception/ExceptionAdviceHandler.java new file mode 100644 index 0000000..6d9af8f --- /dev/null +++ b/riven-server/src/main/java/cn/axzo/riven/config/exception/ExceptionAdviceHandler.java @@ -0,0 +1,252 @@ +package cn.axzo.riven.config.exception; + +import cn.axzo.apollo.core.exception.ApiException; +import cn.axzo.apollo.core.web.ControllerException; +import cn.axzo.foundation.exception.BusinessException; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.maokai.api.labour.common.lang.BizException; +import cn.azxo.framework.common.model.CommonResponse; +import cn.azxo.framework.common.utils.LogUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.validation.ObjectError; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingRequestHeaderException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +import javax.servlet.ServletException; +import javax.validation.ConstraintViolationException; +import java.nio.file.AccessDeniedException; +import java.util.List; + +import static cn.axzo.maokai.api.labour.common.enums.ErrorCodeEnum.FORBIDDEN; +import static cn.axzo.maokai.api.labour.common.enums.ErrorCodeEnum.INVALID_PARAMETER; +import static cn.axzo.maokai.api.labour.common.enums.ErrorCodeEnum.SYSTEM_ERROR; + +/** + * @author cn + * @version 1.0 + * @description + * @date 2022/6/11 15:53 + */ + +@Order(value = 0) +@RestControllerAdvice +@Slf4j +public class ExceptionAdviceHandler { + + @ExceptionHandler(value = cn.axzo.basics.common.exception.ServiceException.class) + public CommonResponse bizException(cn.axzo.basics.common.exception.ServiceException e) { + log.warn("ControllerExceptionHandler.bizException Exception", e); + return CommonResponse.error(e.getErrorCode(), e.getMessage()); + } + + @ExceptionHandler(value = cn.axzo.core.service.ServiceException.class) + public CommonResponse bizException(cn.axzo.core.service.ServiceException e) { + log.warn("ControllerExceptionHandler.bizException Exception", e); + return CommonResponse.error(9998, e.getMessage()); + } + + @ExceptionHandler(value = BizException.class) + public CommonResponse bizException(BizException e) { + log.warn("ControllerExceptionHandler.bizException Exception", e); + return CommonResponse.error(e.getBizCode(), e.getMessage()); + } + + @ExceptionHandler(value = ApiException.class) + public CommonResponse handleApiException(ApiException e) { + log.warn("ControllerExceptionHandler.handleApiException Exception", e); + return CommonResponse.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(value = IllegalArgumentException.class) + public CommonResponse handleIllegalArgumentException(IllegalArgumentException e) { + log.warn("ControllerExceptionHandler.handleIllegalArgumentException Exception message", e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), e.getMessage()); + } + + @ExceptionHandler(value = Exception.class) + public CommonResponse handleOtherException(Exception e) { + LogUtil.error(LogUtil.ErrorType.ERROR_SYSTEM, "ControllerExceptionHandler.handleOtherException Exception", e); + return CommonResponse.error(SYSTEM_ERROR.getCode(), SYSTEM_ERROR.getMessage()); + } + + @ExceptionHandler(value = Throwable.class) + public CommonResponse handleThrowableException(Throwable e) { + LogUtil.error(LogUtil.ErrorType.ERROR_SYSTEM, "ControllerExceptionHandler.handleThrowableException Exception", e); + return CommonResponse.error(SYSTEM_ERROR.getCode(), SYSTEM_ERROR.getMessage()); + } + + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public CommonResponse handleArgumentValidException(MethodArgumentNotValidException e){ + log.info("ControllerExceptionHandler.handleArgumentValidException Exception", e); + BindingResult bindingResult = e.getBindingResult(); + StringBuilder errorMsg = new StringBuilder(); + for (FieldError fieldError : bindingResult.getFieldErrors()) { + if (-1 == errorMsg.indexOf(fieldError.getDefaultMessage())) { + errorMsg.append(fieldError.getDefaultMessage()).append(","); + } + } + errorMsg.deleteCharAt(errorMsg.length() - 1); + return CommonResponse.error(INVALID_PARAMETER.getCode(), errorMsg.toString()); + } + + /** + * 捕捉Exception异常 + * + * @param ex + * @return + */ + @ExceptionHandler(BusinessException.class) + public ApiResult exceptionHandler(BusinessException ex) { + log.warn("业务异常", ex); + return ApiResult.error(ex.getErrorCode(), ex.getErrorMsg()); + } + + @ExceptionHandler(value = cn.axzo.apollo.core.service.ServiceException.class) + public CommonResponse handleServiceException(cn.axzo.apollo.core.service.ServiceException e) { + log.error("ControllerExceptionHandler.ServiceException Exception", e); + return CommonResponse.error(SYSTEM_ERROR.getCode(), e.getMessage()); + } + + /** + * 捕捉Exception异常 + * + * @param e + * @return + */ + @ExceptionHandler(DuplicateKeyException.class) + public CommonResponse exceptionHandler(DuplicateKeyException e) { + log.info("重复数据提交", e); + return CommonResponse.error(SYSTEM_ERROR.getCode(), "重复数据提交"); + } + + /** + * 捕捉Exception异常 + * + * @param e + * @return + */ + @ExceptionHandler(ServletException.class) + public CommonResponse exceptionHandler(ServletException e) { + LogUtil.error(LogUtil.ErrorType.ERROR_UNKNOWN, "接口异常", e); + return CommonResponse.error(SYSTEM_ERROR.getCode(), "操作失败,请联系工作人员处理"); + } + /** + * 捕捉Exception异常 + * + * @param e + * @return + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public CommonResponse exceptionHandler(MethodArgumentTypeMismatchException e) { + log.warn("参数错误", e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), "参数错误", null); + } + /** + * 捕捉Exception异常 + * + * @param e + * @return + */ + @ExceptionHandler(ControllerException.class) + public CommonResponse exceptionHandler(ControllerException e) { + LogUtil.error(LogUtil.ErrorType.ERROR_UNKNOWN, "控制层异常", e); + return CommonResponse.error(e.getMessage()); + } + + /** + * 请求方式不正确 + * + * @param e + * @return + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public CommonResponse exceptionHandler(HttpRequestMethodNotSupportedException e) { + log.warn("请求方式不正确", e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), "请求方式不正确", null); + } + + + /** + * 参数验证失败 + * + * @param e + * @return + */ + @ExceptionHandler(BindException.class) + public CommonResponse exceptionHandler(BindException e) { + List allErrors = e.getBindingResult().getAllErrors(); + if (CollectionUtils.isEmpty(allErrors)) { + return CommonResponse.fail("操作失败 请联系系统管理员"); + } + ObjectError objectError = allErrors.get(0); + String objectErrorDefaultMessage = objectError.getDefaultMessage(); + return CommonResponse.fail(objectErrorDefaultMessage); + } + + + /** + * 参数验证失败 + * + * @param e + * @return + */ + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public CommonResponse exceptionHandler(HttpMediaTypeNotSupportedException e) { + log.warn(e.getMessage(), e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), "请求的内容格式不正确", null); + } + + /** + * 无权限访问接口 + * + * @param e + * @return + */ + @ExceptionHandler(AccessDeniedException.class) + public CommonResponse handle401(AccessDeniedException e) { + log.warn("您没有权限访问", e); + return CommonResponse.error(FORBIDDEN.getCode(), "您没有权限访问", null); + } + + @ExceptionHandler(MissingServletRequestParameterException.class) + public CommonResponse exceptionHandler(MissingServletRequestParameterException e) { + log.warn("参数错误", e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), "参数错误", null); + } + + @ExceptionHandler(MissingRequestHeaderException.class) + public CommonResponse exceptionHandler(MissingRequestHeaderException e) { + log.warn("参数错误", e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), "参数错误", null); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + public CommonResponse exceptionHandler(HttpMessageNotReadableException e) { + log.warn("参数错误", e); + if (e.getMessage().contains("out of range")) { + return CommonResponse.error("参数超出范围"); + } + return CommonResponse.error(INVALID_PARAMETER.getCode(), "参数错误", null); + } + + @ExceptionHandler(ConstraintViolationException.class) + public CommonResponse exceptionHandler(ConstraintViolationException e) { + log.warn("参数错误", e); + return CommonResponse.error(INVALID_PARAMETER.getCode(), + e.getConstraintViolations().iterator().next().getMessage(), null); + } + +} diff --git a/riven-server/src/main/resources/logback-spring.xml b/riven-server/src/main/resources/logback-spring.xml index 922ff24..977ff74 100644 --- a/riven-server/src/main/resources/logback-spring.xml +++ b/riven-server/src/main/resources/logback-spring.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java b/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java index 64d4ebc..af2713b 100644 --- a/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java +++ b/riven-third/src/main/java/cn/axzo/riven/third/controller/ThirdPartPersonController.java @@ -55,7 +55,7 @@ public class ThirdPartPersonController implements ThirdPartPersonApi { param.check(); ThirdProject thirdProject = thirdProjectDao.lambdaQuery().eq(ThirdProject::getThirdCode, param.getThirdCode()) .eq(StrUtil.isNotBlank(param.getThirdProjectId()), ThirdProject::getThirdProjectId, param.getThirdProjectId()) - .apply(param.getWorkspaceId() != null, " extra -> '$.workspaceId' = {0} ", param.getWorkspaceId()) + .apply(param.getWorkspaceId() != null, " third_project_ext -> '$.workspaceId' = {0} ", param.getWorkspaceId()) .eq(ThirdProject::getIsDelete, TableIsDeleteEnum.NORMAL.value) .one(); if (thirdProject == null){ @@ -66,7 +66,7 @@ public class ThirdPartPersonController implements ThirdPartPersonApi { } List result = thirdProjectPersonDao.lambdaQuery() .eq(ThirdProjectPerson::getThirdCode, param.getThirdCode()) - .eq(ThirdProjectPerson::getThirdProjectId, param.getThirdProjectId()) + .eq(ThirdProjectPerson::getThirdProjectId, thirdProject.getThirdProjectId()) .in(CollUtil.isNotEmpty(param.getThirdUniquePersonIds()), ThirdProjectPerson::getThirdUniquePersonId, param.getThirdUniquePersonIds()) .eq(ThirdProjectPerson::getIsDelete, TableIsDeleteEnum.NORMAL.value) .list() @@ -97,7 +97,7 @@ public class ThirdPartPersonController implements ThirdPartPersonApi { List result = thirdProjectPersonDao.lambdaQuery() .eq(ThirdProjectPerson::getThirdCode, param.getThirdCode()) - .eq(ThirdProjectPerson::getThirdProjectId, param.getThirdProjectId()) + .eq(ThirdProjectPerson::getThirdProjectId, thirdProject.getThirdProjectId()) .in(ThirdProjectPerson::getThirdUniquePersonId, thirdPersonMap.keySet()) .eq(ThirdProjectPerson::getIsDelete, TableIsDeleteEnum.NORMAL.value) .list()