Controller开发规范

一、Controller层的职责

controller层的职责:是对用户的数据进行校验、组织、重组、转换等,之后调用service层或者repository层对业务数据进行处理,同时对service/repository层进行包装,不应该预约其职责进行业务的处理和数据层的读写
经典的controller代码结构如下:

@ApiOperation(value = "获取首页数据", notes = "获取首页数据")
@ResponseStatus(HttpStatus.OK)
@GetMapping
public ResponseData index(HttpServletRequest request) {    
    // 校验参数
    validParams(request);
   
    // 包装并转换参数
    BizData data = extractParam(request);
    
    // 调用服务 A
    Data data1 = serviceA.call(data);
    
    // 调用服务 B
    Data data2 = serviceB.call(data);
    
    // 包装返回结果
    Data result = wrap(data1, data2);
    
    return result;
}

@ApiOperation(value = "创建Banner数据", notes = "创建Banner数据")
@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public Banner create(@ApiParam(value = "Banner信息") @RequestBody Banner banner) {
    
    // 校验参数
    validBanner(banner);
    
    // 调用服务,并(包装)返回结果
    return bannerRepository.save(banner);
}

二、返回值规范

对外提供接口的返回值规范,建议采用如下返回值结构规范

public class ApiResult<T> implements Serializable {

    private static final long serialVersionUID = -7723411693664353214L;

    private T data;
    private Integer code;
    private String message;
}

数据结构主要分为三部分:
1、返回码(code):该部分标识本次调用的结果码
2、提示信息(message):如果有的话(通常错误的时候应该要提供)
3、数据对象(T):支持泛型(通常错误的时候可能没有)

重要:服务提供者有义务将调用是否成功的逻辑封装到内部(如自定义isSuccess()方法返回true/false),而不是仅仅返回code消费者去判定

完成的ApiResult代码

/**
 * 统一接口返回结果
 *
 * Time: 2018/12/29 : 15:57
 */
@Data
public class ApiResult<T> {

    protected int code;

    protected String message;

    protected T data;
    /**
     * 结果是否成功的标记
     *
     * @return 是否成功的标记
     */
    public boolean isSuccess() {
        return code == ResultEnum.SUCCESS.getCode();
    }

    public ApiResult() {
    }

    public ApiResult(int code) {
        this.code = code;
    }

    public ApiResult(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
 /**
     * 返回成功
     *
     * @return 成功结果
     */
    public static ApiResult success() {
        return success(null);
    }

    /**
     * 返回成功
     *
     * @return 成功结果
     */
    public static ApiResult success(String message) {
        return success(message, null);
    }

    /**
     * 返回带数据结果
     *
     * @param data 数据
     * @return 携带数据结果
     */
    public static <T> ApiResult<T> success(T data) {
        return success(null, data);
    }

    /**
     * 返回带数据结果
     *
     * @param data 数据
     * @return 携带数据结果
     */
    public static <T> ApiResult<T> success(String message, T data) {
        ApiResult<T> result = new ApiResult<>(ResultEnum.SUCCESS.getCode());
        result.setMessage(message);
        result.setData(data);
        return result;
    }

    /**
     * 返回失败
     *
     * @param result 返回结果
     * @return 失败结果
     */
    public static <T> ApiResult<T> failure(ResultEnum result) {
        return failure(result.getCode(), result.getMessage());
    }

    /**
     * 返回失败
     *
     * @param code    返回码
     * @param message 返回信息
     * @return 失败结果
     */
    public static <T> ApiResult<T> failure(int code, String message) {
        return failure(code, message, null);
    }

    /**
     * 返回失败
     *
     * @param code    返回码
     * @param message 返回信息
     * @param data    数据
     * @return 失败结果
     */
    public static <T> ApiResult<T> failure(int code, String message, T data) {
        if (code == ResultEnum.SUCCESS.getCode()) {
            throw new IllegalArgumentException("错误码[" + code + "]不能和成功的编码一样");
        }
        return new ApiResult<>(code, message, data);
    }
}

Controller注解规范

注解规范1

注解规范2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容