创建服务端Java项目
idea中操作路径如下:
选择File——> New ——> Project
进入到创建项目的页面
Name:项目名字
Group:唯一标识您的项目,通常以颠倒的公司域名开头。
Artifact:组内工件的名称,通常是项目名称。
Package name:通常是Group + Artifact 的组合,可自行调整为自己所需 内容
点击next 后进行到下一项,按自己所需的内容来选择所需jar包添加进来。
点击create 完成创建。
创建系统内的模块
在刚刚创建的项目上右键,New——> Moudle
弹窗后的包结构保持项目一致即可。
项目结构
项目创建完成之后,目录结构如下图所示
yuxuntoo-base-api:小程序api接口
yuxuntoo-base-manage:后台管理系统
yuxuntoo-base-common:通用模块
yuxuntoo-base-core:核心包
yuxuntoo-base-db:操作数据库entity、mapper、service
核心包的使用
核心包中引入了基础包,包含了返回封装对象以及统一异常处理。
统一返回对象
对象封装了返回code码,提示信息,返回结果对象,签名及加密数据
代码如下:
public class ApiResult implements Serializable {
private String resultCode;
public String msg;
public Object data;
private String encryptData;
private String sign;
public ApiResult() {
this.resultCode = ApiResponse.SUCCESS.getResCode();
this.msg = ApiResponse.SUCCESS.getResDesc();
}
public ApiResult(String resultCode, String msg, Object data, String encryptData, String sign) {
this.resultCode = resultCode;
this.msg = msg;
this.data = data;
this.encryptData = encryptData;
this.sign = sign;
}
public static ApiResult ok() {
return new ApiResult();
}
public static ApiResult ok(Map<String, Object> data) {
return new ApiResult(ApiResponse.SUCCESS.getResCode(), ApiResponse.SUCCESS.getResDesc(), data, (String)null, (String)null);
}
public static ApiResult ok(String key, Object value) {
Map<String, Object> data = new HashMap();
data.put(key, value);
return new ApiResult(ApiResponse.SUCCESS.getResCode(), ApiResponse.SUCCESS.getResDesc(), data, (String)null, (String)null);
}
public static ApiResult ok(Object value) {
return new ApiResult(ApiResponse.SUCCESS.getResCode(), ApiResponse.SUCCESS.getResDesc(), value, (String)null, (String)null);
}
public static ApiResult fail(ApiResponse apiResponse, String... params) {
if (params != null && params.length > 0) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < params.length; ++i) {
if (i < params.length - 1) {
sb.append(params[i]).append(" ");
} else {
sb.append(params[i]);
}
}
return new ApiResult(apiResponse.getResCode(), sb.toString(), (Object)null, (String)null, (String)null);
} else {
return new ApiResult(apiResponse.getResCode(), apiResponse.getResDesc(), (Object)null, (String)null, (String)null);
}
}
public static ApiResult customInfo(ApiResponse apiResponse, String msg, Map<String, Object> data) {
return !StringUtils.isEmpty(msg) ? new ApiResult(apiResponse.getResCode(), msg, data, (String)null, (String)null) : new ApiResult(apiResponse.getResCode(), apiResponse.getResDesc(), data, (String)null, (String)null);
}
public String getResultCode() {
return this.resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
public String getMsg() {
return this.msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return this.data;
}
public void setData(Object data) {
this.data = data;
}
public String getEncryptData() {
return this.encryptData;
}
public void setEncryptData(String encryptData) {
this.encryptData = encryptData;
}
public String getSign() {
return this.sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String toString() {
return "ApiResult{resultCode='" + this.resultCode + '\'' + ", msg='" + this.msg + '\'' + ", data=" + this.data + '}';
}
}
统一异常处理
统一异常处理模块中默认实现了几类异常,可根据自己代码中的内容来抛出异常,具体的实现如下图:
异常处理
异常处理会进行统一处理,放到Handler中。
这里不活了我们自定义的BaseException、系统中的sql异常SQLIntegrityConstraintViolationException、NoSuchMethodException等等。完全可以按照自己所需的异常添加进此Handler中。
异常处理器代码如下:
public class YuXunTooExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public YuXunTooExceptionHandler() {
}
@ExceptionHandler({BaseException.class})
public ApiResult handle(BaseException e) {
this.logger.error("=======捕获异常信息=======", e);
ApiResponse response = e.getResponse();
this.logger.info("{}:==={}", response.toString(), e.getMessage());
return response != null && !StringUtils.isBlank(response.getResDesc()) ? ApiResult.fail(e.getResponse(), new String[]{e.getMessage()}) : ApiResult.fail(e.getResponse(), new String[]{e.getMessage()});
}
@ExceptionHandler({SQLIntegrityConstraintViolationException.class})
public ApiResult sQLIntegrityConstraintViolationException(SQLIntegrityConstraintViolationException exception) {
this.logger.warn("SQLIntegrityConstraintViolationException:违反数据库索引规则");
ApiResult result = new ApiResult();
result.setResultCode(ApiResponse.DATABASE_SERVICES_ERROR.getResCode());
result.setMsg(ApiResponse.DATABASE_SERVICES_ERROR.getResDesc());
return result;
}
@ExceptionHandler({SQLException.class})
public ApiResult sQLIntegrityConstraintViolationException(SQLException exception) {
this.logger.warn("SQLException:SQL异常===={}", exception.getMessage());
ApiResult result = new ApiResult();
result.setResultCode(ApiResponse.DATABASE_SQL_ERROR.getResCode());
result.setMsg(ApiResponse.DATABASE_SQL_ERROR.getResDesc());
return result;
}
@ExceptionHandler({NoSuchMethodException.class})
public ApiResult noSuchMethodExceptionException(SQLException exception) {
this.logger.warn("NoSuchMethodException:===={}", exception.getMessage());
ApiResult result = new ApiResult();
result.setResultCode(ApiResponse.NO_SUCHMETHOD.getResCode());
result.setMsg(ApiResponse.NO_SUCHMETHOD.getResDesc());
return result;
}
}
工具类
基础包中也有很多基础工具类,可咨询获取基础包,拿到基础包后,看代码中的使用。具体工具类对应包关系
date:日期相关工具类
file: 文件相关工具类
string:字符串相关工具类
request:请求相关工具类
结束语
服务端系统搭建如其他项目创建一样简单,并无其他复杂操作。工具类的说明如上所述。
欢迎大家留言交流。