目录
pom文件中两个关键标签dependencyManagement和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;
}