SpringBoot项目标准化代码编写

#一、认识项目结构

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;
    /**
     * 排序
   
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值