Преглед на файлове

modify: exception处理规范

370774330@qq.com преди 5 години
родител
ревизия
cbe02b6333
променени са 21 файла, в които са добавени 89 реда и са изтрити 93 реда
  1. 0 1
      api/src/main/java/seecoder/devcloud/api/ApplicationProperties.java
  2. 15 1
      common/src/main/java/seecoder/devcloud/common/exceptions/ServiceException.java
  3. 4 0
      common/src/main/java/seecoder/devcloud/common/util/DateUtil.java
  4. 17 1
      core/src/main/java/seecoder/devcloud/core/pipeline/PipelineException.java
  5. 2 1
      core/src/main/java/seecoder/devcloud/core/pipeline/config/HandlerConfigTable.java
  6. 5 4
      core/src/main/java/seecoder/devcloud/core/pipeline/handler/DockerImageBuildHandler.java
  7. 2 1
      core/src/main/java/seecoder/devcloud/core/pipeline/template/PipelineTemplateTable.java
  8. 10 15
      core/src/main/resources/application-local.yml
  9. 2 1
      web/src/main/java/seecoder/devcloud/web/controller/project/ProjectController.java
  10. 3 5
      web/src/main/java/seecoder/devcloud/web/controller/tree/TreeNodesController.java
  11. 3 2
      web/src/main/java/seecoder/devcloud/web/controller/user/GroupController.java
  12. 0 8
      web/src/main/java/seecoder/devcloud/web/infrastructure/GlobalExceptionHandler.java
  13. 0 3
      web/src/main/java/seecoder/devcloud/web/model/vo/Response.java
  14. 2 2
      web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java
  15. 8 12
      web/src/main/java/seecoder/devcloud/web/service/impl/tree/TreeNodeServiceImpl.java
  16. 8 7
      web/src/main/java/seecoder/devcloud/web/service/impl/user/GroupServiceImpl.java
  17. 2 1
      web/src/main/java/seecoder/devcloud/web/service/project/ProjectService.java
  18. 3 2
      web/src/main/java/seecoder/devcloud/web/service/tree/TreeNodeService.java
  19. 1 1
      web/src/main/java/seecoder/devcloud/web/service/user/GroupService.java
  20. 0 15
      web/src/main/java/seecoder/devcloud/web/utils/TimeUtils.java
  21. 2 10
      web/src/test/java/seecoder/devcloud/web/service/user/GroupServiceTest.java

+ 0 - 1
api/src/main/java/seecoder/devcloud/api/ApplicationProperties.java

@@ -42,7 +42,6 @@ public class ApplicationProperties {
 		@NotEmpty
 		private String token;
 
-
 	}
 
 	@Data

+ 15 - 1
common/src/main/java/seecoder/devcloud/common/exceptions/ServiceException.java

@@ -6,13 +6,27 @@ import org.springframework.http.HttpStatus;
 
 @Getter
 @ToString
-public class ServiceException extends RuntimeException {
+public class ServiceException extends Exception{
 	private final int code;
 
 	public ServiceException() {
 		this(HttpStatus.INTERNAL_SERVER_ERROR.value(), HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
 	}
 
+	public ServiceException(int error, Throwable e) {
+		this(error, message(error), e);
+	}
+
+	public ServiceException(String message, Throwable e) {
+		this(HttpStatus.INTERNAL_SERVER_ERROR.value(), message, e);
+	}
+
+	public ServiceException(int error, String message, Throwable e) {
+		super(message, e);
+		this.code = error;
+	}
+
+
 	public ServiceException(int error) {
 		this(error, message(error));
 	}

+ 4 - 0
common/src/main/java/seecoder/devcloud/common/util/DateUtil.java

@@ -2,6 +2,7 @@ package seecoder.devcloud.common.util;
 
 import org.joda.time.DateTime;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -49,5 +50,8 @@ public class DateUtil {
                 dateTime.getSecondOfMinute());
     }
 
+    public static SimpleDateFormat getSimpleDateFormat(){
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    }
 
 }

+ 17 - 1
core/src/main/java/seecoder/devcloud/core/pipeline/PipelineException.java

@@ -7,7 +7,23 @@ package seecoder.devcloud.core.pipeline;
  */
 public class PipelineException extends Exception{
 
-    public PipelineException(String msg){
+    public static final String TEMPLATE_NAME_NOT_EXIST = "Pipeline模板名不存在";
+    public static final String CONFIG_TRANSFER_ERROR = "流水线配置转换发生错误";
+    public static final String GIT_CLONE_ERROR = "从仓库拉取代码发生错误";
+    public static final String DOCKERFILE_CREATE_ERROR = "创建dockerfile文件错误";
+    public static final String IMAGE_BUILD_ERROR = "构建镜像构建推送到仓库错误";
+    private int code;
+    private String msg;
+
+    public PipelineException(int code, String msg) {
         super(msg);
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public PipelineException(int code, String msg, Throwable cause) {
+        super(msg, cause);
+        this.code = code;
+        this.msg = msg;
     }
 }

+ 2 - 1
core/src/main/java/seecoder/devcloud/core/pipeline/config/HandlerConfigTable.java

@@ -1,6 +1,7 @@
 package seecoder.devcloud.core.pipeline.config;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpStatus;
 import seecoder.devcloud.core.pipeline.Handler;
 import seecoder.devcloud.core.pipeline.PipelineException;
 
@@ -32,7 +33,7 @@ public class HandlerConfigTable {
         try {
             handler = (Handler) handlerConfigMap.get(config).newInstance();
         } catch (InstantiationException | IllegalAccessException e) {
-            throw new PipelineException("Error: config.getName() 流水线配置转换发生错误: " + e.getMessage());
+            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE,PipelineException.CONFIG_TRANSFER_ERROR, e);
         }
         return handler;
     }

+ 5 - 4
core/src/main/java/seecoder/devcloud/core/pipeline/handler/DockerImageBuildHandler.java

@@ -6,6 +6,7 @@ import com.spotify.docker.client.messages.ProgressMessage;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpStatus;
 import org.eclipse.jgit.api.Git;
 import org.springframework.util.ResourceUtils;
 import seecoder.devcloud.api.docker.DockerApi;
@@ -60,7 +61,7 @@ public class DockerImageBuildHandler extends AbstractHandler {
         } catch (Exception e) {
             String error = "Error: 从仓库拉取代码发生错误, " + e.getMessage() + "\n";
             context.setResult(context.getResult() + error);
-            throw new PipelineException(error);
+            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE, PipelineException.GIT_CLONE_ERROR,e);
         }
         //2. 帮助学生创建dockerfile文件
         //todo 待测试创建非临时文件会不会有问题
@@ -72,9 +73,9 @@ public class DockerImageBuildHandler extends AbstractHandler {
             File dFile = ResourceUtils.getFile("classpath:" + PipelineTemplateTable.getTemplateDockerfileName(templateName));
             FileUtils.copyDirectory(dFile,dockerfile.toFile());
         } catch (IOException e) {
-            String error = "Error: 常见dockerfile文件错误, " + e.getMessage() + "\n";
+            String error = "Error: 创建dockerfile文件错误, " + e.getMessage() + "\n";
             context.setResult(context.getResult() + error);
-            throw new PipelineException(error);
+            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE, PipelineException.DOCKERFILE_CREATE_ERROR,e);
         }
 
         //3. 镜像构建
@@ -98,7 +99,7 @@ public class DockerImageBuildHandler extends AbstractHandler {
         } catch (Exception e) {
             String error = "Error: 构建镜像推送到仓库错误, " + e.getMessage() + "\n";
             context.setResult(context.getResult() + error);
-            throw new PipelineException(error);
+            throw new PipelineException(HttpStatus.SC_SERVICE_UNAVAILABLE, PipelineException.IMAGE_BUILD_ERROR ,e);
         }
         //4. 将镜像名字加入context
         context.getConfigs().put("imageName", imageName);

+ 2 - 1
core/src/main/java/seecoder/devcloud/core/pipeline/template/PipelineTemplateTable.java

@@ -1,5 +1,6 @@
 package seecoder.devcloud.core.pipeline.template;
 
+import org.apache.http.HttpStatus;
 import seecoder.devcloud.core.pipeline.PipelineException;
 
 import java.util.ArrayList;
@@ -30,7 +31,7 @@ public class PipelineTemplateTable {
 
     public static void validateTemplateName(String name) throws PipelineException {
         if (!templateNames.contains(name)){
-            throw new PipelineException("pipeline模板名不存在");
+            throw new PipelineException(HttpStatus.SC_BAD_REQUEST, PipelineException.TEMPLATE_NAME_NOT_EXIST);
         }
     }
 

+ 10 - 15
core/src/main/resources/application-local.yml

@@ -25,31 +25,26 @@ mybatis:
     map-underscore-to-camel-case: true
 
 seecoder:
+  jwt:
+    secret: U0VFQy0xOTE5ODEwLU9JREMtMTE0NTE0
   k8s:
     api-server: https://192.168.99.105:8443
     token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjBmSXc4RlRjNUpBYVpGYWc4QzRDY1MzUWJad1JMdFhKcDI1cngzWGtiRlkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZXZjbG91ZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLXNicXY4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI5NmIxNzU1ZS0zZjE3LTQ1ZTctODFmYi01MTRhODA3NDRhMzQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGV2Y2xvdWQ6ZGVmYXVsdCJ9.W0Y1lR6LBi1ZjylBx35YeqYuq2u2AqH-ayK4FD-LDfC26E89DanOwSv9XLrRMnnDBZFS_ZCRBumbnDeMiS5vw2x7-QnrDqj1M5u9FB2fIJsz2LyUkOhATZZmTzj_Uhewvvg09aDKh16ttj6ZX27m-KVk_6MP-VfiuvZnCVxDbqRkRjK-zsor4ty1CEATPyKK-tvugAwS0RFNHUL94DamfZAq_t1PSnH5ZtEHq0uEMZxY2c7j6u9d_aD9lphm_ZpCy_C8OCHfanM21CQPDHlcJTW_aiOO6bAp8qdc1egPO5uIamHl6Zm0N3RkcsRp4DGOHrltTV9y_cGZHXSWmRHfxw
     debugging: true
+    ingressHostSuffix: .devcloud.seec.seecoder.cn
   gitlab:
     host: http://gitlab.192.168.99.105.nip.io
-    webHookProxy: http://localhost:3000
     token: wXDeETv2Kmt-JhiApJ9H
   mail:
     from: 370774330@qq.com
-
-
-  jenkins:
-    host: http://192.168.68.79:8082
-    username: root
-    token: 11d7b9e4c1acac481904c25813e2ec1f0a
+  git:
+    password: mock
+    username: mock
   docker:
-    registry: 192.168.68.79:18082
+    host: unix:///var/run/docker.sock
+    registry: 192.168.99.105:30060
+    registryUsername: admin
+    registryPassword: admin
 
 
 
-  registry:
-    host: 192.168.68.79:18082
-    username: admin
-    password: admin123
-    nexus-server: 192.168.68.79:18081
-    repo-name: sec-repo
-    clean-up-task: 83bb8249-71e8-4367-83b3-50c6f7518860

+ 2 - 1
web/src/main/java/seecoder/devcloud/web/controller/project/ProjectController.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
 import seecoder.devcloud.web.service.project.ProjectService;
@@ -48,7 +49,7 @@ public class ProjectController {
     @ApiOperation(value = "创建项目,传入的参数中不必带有效的projectId字段,返回一个创建后的结果,注入id", httpMethod = "POST")
     @PostMapping("/create")
     @ApiImplicitParam(name = "project",dataType = "object", paramType = "body")
-    public Response<ProjectVO> createProject(@RequestBody ProjectVO project){
+    public Response<ProjectVO> createProject(@RequestBody ProjectVO project) throws ServiceException {
         return Response.buildSuccess(projectService.createProject(project));
     }
 

+ 3 - 5
web/src/main/java/seecoder/devcloud/web/controller/tree/TreeNodesController.java

@@ -6,13 +6,11 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import seecoder.devcloud.web.model.po.tree.TreeNodePO;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
 import seecoder.devcloud.web.model.vo.TreeNodeVO;
 import seecoder.devcloud.web.service.tree.TreeNodeService;
 
-
-
 import java.util.List;
 
 /**
@@ -47,7 +45,7 @@ public class TreeNodesController {
     @ApiOperation(value = "插入节点", httpMethod = "POST")
     @ApiImplicitParam(value = "treeNodeVO",dataType ="object", paramType = "body")
     @PostMapping("/node")
-    public Response insertTreeNode(@RequestBody TreeNodeVO treeNodeVO){
+    public Response insertTreeNode(@RequestBody TreeNodeVO treeNodeVO) throws ServiceException {
         treeNodeService.insertTreeNode(treeNodeVO);
         return Response.buildSuccess();
     }
@@ -62,7 +60,7 @@ public class TreeNodesController {
     @ApiOperation(value = "根据父节点fatherId创建一个子节点并返回", httpMethod = "POST")
     @PostMapping("/subNode/{fatherId}")
     @ApiImplicitParam(value = "fatherId",dataType ="int", paramType = "path")
-    public Response insertTreeNodeByFatherNode(@PathVariable("fatherId") int fatherId){
+    public Response insertTreeNodeByFatherNode(@PathVariable("fatherId") int fatherId) throws ServiceException {
         return Response.buildSuccess(treeNodeService.insertTreeNodeByFatherNode(fatherId));
     }
 

+ 3 - 2
web/src/main/java/seecoder/devcloud/web/controller/user/GroupController.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
 import seecoder.devcloud.web.model.vo.user.GroupVO;
 import seecoder.devcloud.web.service.user.GroupService;
@@ -52,7 +53,7 @@ public class GroupController {
     public Response<GroupVO> createGroup(@RequestParam("name")
                                     @Validated
                                     @Pattern(regexp = "^\\w{3,20}$", message = "组名称只能为长度为3-20且由数字、26个英文字母或者下划线组成的字符串")
-                                            String name){
+                                            String name) throws ServiceException {
         return Response.buildSuccess(groupService.createGroup(name));
     }
 
@@ -63,7 +64,7 @@ public class GroupController {
     })
     @PostMapping("/members")
     public Response addMember(@RequestParam("invitedUserId") Integer invitedUserId,
-                              @RequestParam("groupId") Integer groupId){
+                              @RequestParam("groupId") Integer groupId) throws ServiceException {
         groupService.addMember(invitedUserId, groupId);
         return Response.buildSuccess();
     }

+ 0 - 8
web/src/main/java/seecoder/devcloud/web/infrastructure/GlobalExceptionHandler.java

@@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 import seecoder.devcloud.common.exceptions.ServiceException;
-import seecoder.devcloud.web.infrastructure.security.TokenExpiredException;
 import seecoder.devcloud.web.model.vo.Response;
 
 import javax.validation.ConstraintViolationException;
@@ -50,11 +49,4 @@ public class GlobalExceptionHandler {
         log.error("Error: ",e);
         return Response.buildFailure(503,e.getMessage());
     }
-
-    @ExceptionHandler(TokenExpiredException.class)
-    @ResponseBody
-    public Response tokenExpiredExceptionHandler(TokenExpiredException e){
-        log.error("Error: ",e);
-        return Response.buildFailure(e.getCode(), e.getMessage());
-    }
 }

+ 0 - 3
web/src/main/java/seecoder/devcloud/web/model/vo/Response.java

@@ -1,9 +1,6 @@
 package seecoder.devcloud.web.model.vo;
 
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
-import seecoder.devcloud.common.exceptions.ServiceException;
 
 import java.io.Serializable;
 

+ 2 - 2
web/src/main/java/seecoder/devcloud/web/service/impl/project/ProjectServiceImpl.java

@@ -48,13 +48,13 @@ public class ProjectServiceImpl implements ProjectService {
     }
 
     @Override
-    public ProjectVO createProject(ProjectVO projectVO) {
+    public ProjectVO createProject(ProjectVO projectVO) throws ServiceException {
         Project project = new Project();
         BeanUtils.copyProperties(projectVO,project);
         try {
             seecoderGitlabApi.createProject(projectVO.getName(), VisibilityForm.PRIVATE);
         } catch (SeecoderGitlabException e) {
-            throw new ServiceException("Error: 创建项目是时发生异常[" + e.getMessage() + "]");
+            throw new ServiceException("创建项目是时发生异常[" + e.getMessage() + "]", e);
         }
         projectMapper.insertProject(project);
 

+ 8 - 12
web/src/main/java/seecoder/devcloud/web/service/impl/tree/TreeNodeServiceImpl.java

@@ -5,22 +5,18 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import seecoder.devcloud.common.exceptions.ServiceException;
+import seecoder.devcloud.common.util.DateUtil;
 import seecoder.devcloud.web.aop.TreeLogging;
-
+import seecoder.devcloud.web.dao.tree.TreeNodeMapper;
 import seecoder.devcloud.web.model.enums.NodeStateEnum;
 import seecoder.devcloud.web.model.enums.NodeTypeEnum;
 import seecoder.devcloud.web.model.enums.OperationEnum;
 import seecoder.devcloud.web.model.po.tree.TreeNodePO;
-import seecoder.devcloud.web.service.tree.TreeNodeService;
-import seecoder.devcloud.web.model.vo.Response;
 import seecoder.devcloud.web.model.vo.TreeNodeVO;
-import seecoder.devcloud.web.dao.tree.TreeNodeMapper;
-import seecoder.devcloud.web.utils.TimeUtils;
-
+import seecoder.devcloud.web.service.tree.TreeNodeService;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
-
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -42,13 +38,13 @@ public class TreeNodeServiceImpl implements TreeNodeService {
 
     @Override
     @TreeLogging(OperationEnum.START)
-    public void insertTreeNode(TreeNodeVO treeNodeVO) {
+    public void insertTreeNode(TreeNodeVO treeNodeVO) throws ServiceException {
         TreeNodePO treeNodePO = new TreeNodePO();
         BeanUtils.copyProperties(treeNodeVO,treeNodePO);
         int res = treeNodeMapper.insertTreeNode(treeNodePO);
         // TODO:safety check
         if (res <= 0) {
-            throw new ServiceException(503,"Insert failed!");
+            throw new ServiceException(503,"插入需求节点失败");
         }
     }
 
@@ -74,13 +70,13 @@ public class TreeNodeServiceImpl implements TreeNodeService {
      */
     @Override
     @TreeLogging(OperationEnum.START)
-    public Integer insertTreeNodeByFatherNode(int fatherId) {
+    public Integer insertTreeNodeByFatherNode(int fatherId) throws ServiceException {
         TreeNodePO treeNodePO = getDefaultTreeNodePO();
         treeNodePO.setParentId(fatherId);
         int res = treeNodeMapper.insertTreeNode(treeNodePO);
         // TODO:safety check
         if (res <= 0) {
-            throw new ServiceException(503,"Insert failed!");
+            throw new ServiceException(503,"插入需求节点失败");
         }
         return treeNodePO.getId();
     }
@@ -99,7 +95,7 @@ public class TreeNodeServiceImpl implements TreeNodeService {
      * @return
      */
     private TreeNodePO getDefaultTreeNodePO() {
-        SimpleDateFormat format = TimeUtils.getSimpleDateFormat();
+        SimpleDateFormat format = DateUtil.getSimpleDateFormat();
 
         TreeNodePO treeNodePO = new TreeNodePO();
         treeNodePO.setTitle("title");

+ 8 - 7
web/src/main/java/seecoder/devcloud/web/service/impl/user/GroupServiceImpl.java

@@ -9,7 +9,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import seecoder.devcloud.common.exceptions.EntityNotFoundException;
+import seecoder.devcloud.common.exceptions.AccessDeniedException;
+import seecoder.devcloud.common.exceptions.ConflictException;
 import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.dao.user.GroupMapper;
 import seecoder.devcloud.web.dao.user.GroupMemberMapper;
@@ -53,7 +54,7 @@ public class GroupServiceImpl implements GroupService {
     @Transactional
     public GroupVO createGroup(String name) throws ServiceException {
         if (groupMapper.findGroupByName(name) != null){
-            throw new ServiceException("您创建的小组名字已被使用!");
+            throw new ConflictException("您创建的小组名字已被使用!");
         }
         User user = UserService.loginUser();
         GitlabGroup gitlabGroup = null;
@@ -61,7 +62,7 @@ public class GroupServiceImpl implements GroupService {
             gitlabGroup = seecoderGitlabApi.createGroup(GROUP_NAME_PREFIX + name);
             seecoderGitlabApi.addMember(gitlabGroup.getGroupId(), user.getId(), AccessLevelForm.MASTER);
         } catch (SeecoderGitlabException e) {
-            throw new ServiceException("Error: 创建Group时发生异常[" + e.getMessage() + "]");
+            throw new ServiceException("创建Group时发生异常[" + e.getMessage() + "]",e);
         }
         Group group = Group.builder()
                 .id(gitlabGroup.getGroupId())
@@ -75,22 +76,22 @@ public class GroupServiceImpl implements GroupService {
 
     @Override
     @Transactional
-    public void addMember(Integer invitedUserId, Integer groupId) throws EntityNotFoundException {
+    public void addMember(Integer invitedUserId, Integer groupId) throws ServiceException {
         //当前登陆的用户id
         int userId = UserService.loginUser().getId();
 
         //只有在组内的用户才能邀请
         List<Integer> userIds = groupMemberMapper.selectUserIdsByGroupId(groupId);
         if (!userIds.contains(userId)) {
-            throw new EntityNotFoundException("Error: 小组邀请发生错误,用户没有权限!");
+            throw new AccessDeniedException("小组邀请发生错误,用户没有权限");
         }
         if (userIds.contains(invitedUserId)) {
-            throw new RuntimeException("Error: 邀请的用户已经加入小组!");
+            throw new ConflictException("邀请的用户已经加入小组!");
         }
         try {
             seecoderGitlabApi.addMember(groupId, invitedUserId, AccessLevelForm.MASTER);
         } catch (SeecoderGitlabException e) {
-            throw new ServiceException("Error: 将成员加入Group时发生异常[" + e.getMessage() + "]");
+            throw new ServiceException("将成员加入Group时发生异常[" + e.getMessage() + "]", e);
         }
         groupMemberMapper.insert(groupId, invitedUserId);
         //Group group = groupMapper.findWithMembersById(groupId);

+ 2 - 1
web/src/main/java/seecoder/devcloud/web/service/project/ProjectService.java

@@ -1,5 +1,6 @@
 package seecoder.devcloud.web.service.project;
 
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.project.ProjectVO;
 
 import java.util.List;
@@ -29,7 +30,7 @@ public interface ProjectService {
      * @param project 不包含id
      * @return 注入id后返回
      */
-    ProjectVO createProject(ProjectVO project);
+    ProjectVO createProject(ProjectVO project) throws ServiceException;
 
     /**
      * 删除项目,懒删除

+ 3 - 2
web/src/main/java/seecoder/devcloud/web/service/tree/TreeNodeService.java

@@ -3,6 +3,7 @@ package seecoder.devcloud.web.service.tree;
 
 
 
+import seecoder.devcloud.common.exceptions.ServiceException;
 import seecoder.devcloud.web.model.vo.Response;
 import seecoder.devcloud.web.model.vo.TreeNodeVO;
 
@@ -23,7 +24,7 @@ public interface TreeNodeService {
      * 新增一条需求
      * @param treeNodeVO
      */
-    void insertTreeNode(TreeNodeVO treeNodeVO);
+    void insertTreeNode(TreeNodeVO treeNodeVO) throws ServiceException;
 
     /**
      * 更新一条需求
@@ -42,7 +43,7 @@ public interface TreeNodeService {
      * @param fatherId
      * @return
      */
-    Integer insertTreeNodeByFatherNode(int fatherId);
+    Integer insertTreeNodeByFatherNode(int fatherId) throws ServiceException;
 
 
     List<TreeNodeVO> getNodesWithTaskTypeByProjectid(int projectId);

+ 1 - 1
web/src/main/java/seecoder/devcloud/web/service/user/GroupService.java

@@ -29,7 +29,7 @@ public interface GroupService {
      */
     GroupVO createGroup(String name) throws ServiceException;
 
-    void addMember(Integer invitedUserId, Integer groupId)  throws EntityNotFoundException;
+    void addMember(Integer invitedUserId, Integer groupId) throws ServiceException;
 
     /**
      * todo 目前统一代码服务没有提供对应接口,此方法过期,待统一代码服务api更新后再补回

+ 0 - 15
web/src/main/java/seecoder/devcloud/web/utils/TimeUtils.java

@@ -1,15 +0,0 @@
-package seecoder.devcloud.web.utils;
-
-import java.text.SimpleDateFormat;
-
-/**
- * @program: parent
- * @description: 时间工具
- * @author: xzh
- * @date: 2021-03-10
- **/
-public class TimeUtils {
-    public static SimpleDateFormat getSimpleDateFormat(){
-        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-    }
-}

+ 2 - 10
web/src/test/java/seecoder/devcloud/web/service/user/GroupServiceTest.java

@@ -9,7 +9,6 @@ import org.junit.runner.RunWith;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.junit4.SpringRunner;
 import seecoder.devcloud.api.ApplicationProperties;
 import seecoder.devcloud.common.exceptions.EntityNotFoundException;
@@ -78,18 +77,11 @@ class GroupServiceTest {
         } catch (EntityNotFoundException e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
+        } catch (ServiceException serviceException) {
+            serviceException.printStackTrace();
         }
 
     }
 
 
-    @Test
-    void quitGroup() {
-        try {
-            groupService.quitGroup(47,37);
-        } catch (ServiceException serviceException) {
-            serviceException.printStackTrace();
-            Assert.fail(serviceException.getMessage());
-        }
-    }
 }