您的位置:首页 > 编程语言

电商商城服务端开发--高复用的服务端响应代码设计

2017-07-22 08:16 274 查看
我们开发会从第一个模块用户登录模块开始,在开发之前我会把各个模块对象与服务器端的响应逻辑封装成一个简单的对象(ServerResponse),方便我们随时使用,例如:
public class ServerResponse<T> implements Serializable
利用泛型的设计思想来提高响应的各种需求,并且实现序列化,同时,在响应的逻辑中会用到枚举类,比如说一些响应的状态(成功SUCUSS 0表示,失败ERROR 1表示)等等,还有登录觉色的判断。

package com.mmall.common;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import java.io.Serializable;

/**
* 2017年-7-22
*/
@JsonSerialize(include =  JsonSerialize.Inclusion.NON_NULL)
//保证json序列化的时候,如果是null的对象,key也会消失
public class ServerResponse<T> implements Serializable {

private int status; //响应状态
private String msg;//响应消息
private T data; // 范型的数据类型 可以是空,字符串,对象,List等等

private ServerResponse(int status){
this.status = status;
}
private ServerResponse(int status,T data){
this.status = status;
this.data = data;
}
private ServerResponse(int status,String msg,T data){
this.status = status;
this.msg = msg;
this.data = data;
}
private ServerResponse(int status,String msg){
this.status = status;
this.msg = msg;
}

@JsonIgnore
//使之不在json序列化结果当中
public boolean isSuccess(){
return this.status == ResponseCode.SUCCESS.getCode();
}

public int getStatus(){
return status;
}
public T getData(){
return data;
}
public String getMsg(){
return msg;
}

public static <T> ServerResponse<T> createBySuccess(){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());
}

public static <T> ServerResponse<T> createBySuccessMessage(String msg){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg);
}

public static <T> ServerResponse<T> createBySuccess(T data){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);
}

public static <T> ServerResponse<T> createBySuccess(String msg,T data){
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg,data);
}

public static <T> ServerResponse<T> createByError(){
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
}

public static <T> ServerResponse<T> createByErrorMessage(String errorMessage){
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),errorMessage);
}

public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode,String errorMessage){
return new ServerResponse<T>(errorCode,errorMessage);
}

}


相信大家已经看到了我的设计过程,首先这个响应对象有三个私有成员变量 status,msg,data,分表表示响应状态,响应消息,返回数据类型,例如说我已经注册好开始登录,如果密码错误,这个响应对象里要返回给前端的就是status为 1,msg “登录失败”,data的话可不返回,其中我还想说一下两个注解,

@JsonIgnore和@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
,第一个表示该属性或者方法但参与序列化的进行,不会出现在序列化的结果中,相反的是我们还可以通过后者过滤一些情况,比如当我的某个属性为空的时候,不出现序列化的结果中,并且我还列举了一些同等级的情况如下:

//将该标记放在属性上,如果该属性为NULL则不参与序列化

//如果放在类上边,那对这个类的全部属性起作用

//Include.Include.ALWAYS 默认

//Include.NON_DEFAULT 属性为默认值不序列化

//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化

//Include.NON_NULL 属性为NULL 不序列化 。

接着是用到的ResponseCode响应代码的枚举类如下:

public enum ResponseCode {

SUCCESS(0,"SUCCESS"), // 成功
ERROR(1,"ERROR"),  //  失败
NEED_LOGIN(10,"NEED_LOGIN"),  // 未登录
ILLEGAL_ARGUMENT(2,"ILLEGAL_ARGUMENT"); //参数错误

private final int code;
private final String desc;

ResponseCode(int code,String desc){
this.code = code;
this.desc = desc;
}

public int getCode(){
return code;
}
public String getDesc(){
return desc;
}

}


相信大家等看懂吧,如有需要源码或者有什么问题的可以私下找我,微信:413007703邮箱yangtianrui135@163.com.

完整源码【包含redis分布式缓存 分布式session 定时任务 主从同步。。。。】https://gitee.com/ytrlmy/happy_mmall/tree/v2.0/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐