chat-Service即时通讯项目

目录

一、模块介绍:

pom文件中两个关键标签dependencyManagement和relativePath

dependencyManagement:

dependencies:

relativePath

二、统一异常拦截


       chat-Service即时通讯项目知识点小总结

一、模块介绍:

chat-service-base 用于编写业务逻辑,不对外暴露

chat-service-common 用于存放一些公用的模块,比如说枚举,topic,外部应用可以引

chat-service-socket 用于维护socket连接

cha-service-vue 前端

chat-service-web web模块,为前端提供一些接口

base模块的pom文件存放其他几个模块都能用到依赖,比如:lombok、 阿里JSON解析器 、阿里数据库连接池等等  好处在于其他模块要用到这些依赖只需要导入base模块的pom文件(因为依赖会继承)

<dependency>
    <groupId>com.qcby</groupId>
    <artifactId>chat-service-base</artifactId>
</dependency>

传统项目中common包存放着每个模块可以公用的枚举等共用类,当每个模块需要改变某一项操作(比如:状态码)只需要改变commom包中的枚举即可

对于分布式项目,每个模块都是单独的springboot项目,如果要修改状态码,修改调用的commom文件jar包即可,无需每一个模块单独修改 jar通过pom文件管理

pom文件中两个关键标签dependencyManagement和relativePath

dependencyManagement:

  当一个项目包含的模块很多的时候,由于模块太多,为了确保这些模块中相同依赖项的版本一致,我们通常会抽象出一个parent层来管理这些模块公共的依赖项。

优点:

  统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;

   如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

dependencies:

所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。

二、区别

  dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;

  只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;

  另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

  dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)。

relativePath

下面的就是parent的路径,具体来说就是你引用这个parent项目,那parent项目的pom在哪里

1、默认值

默认我们不用写,那默认值就是..pom.xml,会从本地路径中获取parent的pom,我们建多模块的项目就是这个情况。

2、

<parent>
    <artifactId>chatService</artifactId>
    <groupId>com.qcby</groupId>
    <version>1.0.0</version>
    <relativePath/>
</parent>

这样写,也就是说我指定了relativePath,但值是空的,设定一个空值将始终从仓库中获取,不从本地路径获取。很常见的场景就是使用springboot的时候

3、路径

这种也很显然,指定一个本地的路径,从本地路径获取parent的 pom。

二、统一异常拦截

用以前练习过的拦截代码修改一下用于chat-Sevice框架的异常拦截

@RestControllerAdvice
@Slf4j
public class ExceptionAdvice {
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    public JSONObject exceptionHandler(Exception e){
        log.error("执行异常",e);
        if (e instanceof MethodArgumentNotValidException){
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException)e;
            return JSONObjectUtil.error(exception.getBindingResult().getFieldError().getDefaultMessage());
        }
        else if(e instanceof ServiceException){
            ServiceException exception = (ServiceException) e;
            return JSONObjectUtil.error(exception.getMessage());
        }
        else {
            return JSONObjectUtil.error("内部错误,请联系管理员!");
        }
    }

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 这个注解是后台返回HTTP响应的状态码为@ResponseStatus指定的状态码 框架中的状态码重新定义,所以不需要这个注解

JSONObjectUtil改用统一接口封装后的Result

修改:

@RestControllerAdvice ---->拦截所有的Controller
@Slf4j
public class ChatServiceExceptionAdvice {
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Result exceptionHandler(Exception e) {
        log.error("执行异常", e);
        if (e instanceof MethodArgumentNotValidException) {//方法异常
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
            return Result.getBusinessException(exception.getMessage(), ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
        } else if (e instanceof ChatException) {//自己定义的异常
            ChatException exception = (ChatException) e;
            return Result.getBusinessException(exception.getMessage(), ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
        } else {//其他异常
            return Result.getBusinessException("后台异常,请联系管理员!", ResponseStatus.BUSINESS_ERROR_STATUS.getCode());
        }                                       //⬆这里不能把e抛出去,如果是数据库异常,就会把数据库错误展示给前端


    }
    

异常处理所需的枚举类:

//返回状态吗的枚举类    
@Getter-->枚举只能加getter注解
@AllArgsConstructor
public enum ResponseStatus {

    SUCCESS_STATUS("0","成功"),
    BUSINESS_ERROR_STATUS("-1","业务异常"),
    SERVICE_ERROR_STATUS("-2","系统异常"),
    PARAM_ERROR_STATUS("-3","参数异常");


    private String code;

    private String desc;


}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值