#一、认识项目结构
1、项目基本结构
- 基础功能结构
entitys // 存放实体类
enums // 存放枚举类
dto // 存放入参结构
vo // 存放出参结构
utils // 存放相关工具类
- 核心逻辑功能结构
-controller // 基本参数校验
--service // 存放服务接口
---impl // 存放服务接口实现类(核心业务逻辑功能开发)
----dao // 持久层,数据增删改查
-----provider // 动态sql拼接层,编写动态的sql
2、统一消息返回
- ErrorCodeEnum.java(存放各类错误码)
public enum ErrorCodeEnum {
/**
* 错误码
*/
ERROR(9999, "系统异常"),
HTTP_CONNECTION_OVERTIME(9998, "连接超时"),
FREQUENTLY_REQUEST(9003, "操作频繁"),
INVALID_RSA_KEY(9002, "超时失效"),
TOKEN_TIMEOUT(9005, "token失效"),
INVALID_PARAMS(9001, "非法参数"),
SIGN_ERROR(9000, "签名错误"),
INVALID_STATUS(9004, "状态不符"),
OK(200, "请求通过"),
NO(201, "请求不通过"),
TIP(202, "提示"),
private Integer code;
private String message;
ErrorCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
- ErrorCodeException.java 统一异常结构
@ToString
public class ErrorCodeException extends RuntimeException {
private static final long serialVersionUID = -7638041501183925225L;
private Integer code;
public ErrorCodeException(ErrorCodeEnum errorCode, String msg) {
super(msg);
this.code = errorCode.getCode();
}
public ErrorCodeException(ErrorCodeEnum errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
- SimpleMessage.java (简易信息返回)
@Data
public class SimpleMessage implements Serializable {
private static final long serialVersionUID = -2957516153008725933L;
private Integer errorCode;
private String errorMsg;
public SimpleMessage(ErrorCodeEnum errorCode, String errorMsg) {
this.errorCode = errorCode.getCode();
this.errorMsg = errorMsg;
}
}
- MessageBean.java (丰富信息返回)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MessageBean implements Serializable {
private static final long serialVersionUID = 7192766535561421181L;
private String errorMsg;
private Object data;
private Integer errorCode;
}
- AppResponseBodyAdvice.java 处理统一返回
@Slf4j
@ControllerAdvice
public class AppResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return MappingJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
}
@SuppressWarnings("Duplicates")
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request,
ServerHttpResponse response) {
// 特殊返回类型处理
if (body instanceof SimpleMessage || body instanceof MessageBean) {
return body;
}
MessageBean messageBean = new MessageBean();
messageBean.setErrorCode(ErrorCodeEnum.OK.getCode());
messageBean.setErrorMsg(ErrorCodeEnum.OK.getMessage());
messageBean.setData(body);
return messageBean;
}
}
· ManagerExceptionHandler.java (全局异常处理)
@Slf4j
@ControllerAdvice
public class ManagerExceptionHandler {
@ExceptionHandler(value = ErrorCodeException.class)
@ResponseBody
public SimpleMessage myErrorHandler(ErrorCodeException e) {
SimpleMessage message = new SimpleMessage();
message.setErrorCode(e.getCode());
message.setErrorMsg(e.getMessage());
return message;
}
@ExceptionHandler(value = DuplicateKeyException.class)
@ResponseBody
public SimpleMessage duplicateKeyErrorHandler() {
SimpleMessage message = new SimpleMessage();
message.setErrorCode(ErrorCodeEnum.NO.getCode());
message.setErrorMsg("数据重复");
return message;
}
@ExceptionHandler(value = MaxUploadSizeExceededException.class)
@ResponseBody
public SimpleMessage fileSizeLimitErrorHandler() {
SimpleMessage message = new SimpleMessage();
message.setErrorCode(ErrorCodeEnum.NO.getCode());
message.setErrorMsg("图片过大");
return message;
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public SimpleMessage errorHandler(Exception e, HttpServletRequest request) {
SimpleMessage message = new SimpleMessage();
message.setErrorCode(ErrorCodeEnum.ERROR.getCode());
message.setErrorMsg(ErrorCodeEnum.ERROR.getMessage());
log.error("url [{}] params [{}] error", request.getRequestURI(), JSON.toJSONString(request.getParameterMap()), e);
return message;
}
}
二、了解常用规范
1.实体类(以设备表功能为例)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DeviceInfo implements Serializable {
private static final long serialVersionUID = -4951578247348538266L;
/**
* 自增ID
*/
@NotNull(message = "设备ID不能为空", groups = {Update.class})
private Integer id;
/**
* 设备名称
*/
@NotBlank(message = "设备名称不能为空", groups = {Insert.class, Update.class})
private String deviceName;
/**
* 设备码
*/
@NotNull(message = "设备码不能为空", groups = {Insert.class, Update.class})
private DeviceTypeEnum deviceCode;
/**
* 二级分类ID
*/
@NotNull(message = "二级分类ID", groups = {Insert.class, Update.class})
private Integer parentId;
/**
* 图标地址
*/
@NotBlank(message = "图标地址不能为空", groups = {Insert.class, Update.class})
private String iconUrl;
/**
* 排序