因为一直比较忙,所以在项目创建以后一直在些业务部分,没有关注过项目架构本身的问题,今天抽时间记录一下,博主的项目采用的是基于springcloud的前后端分离的微服务项目,因为也是第一次搞这样的项目,经验不足,在前后端交互问题上没有涉及的很好,导致项目成员在编写代码时总会遇到下面的这些问题,接下来一一介绍.
前后端项目的好处不用多说,前端与后端约定好接口参数,这样前后端只需要完成业务以后测试就可以了,前端不需要等待后端的接口完成,前后端可以同步工作,大大提高了开发效率,但是在后端接口定义的时候,一般会有一些基类,这些基类如果设计的比较好的话,可以大大的节省开发时间,减少bug的产生,我们项目的接口定义主要由两部分组成,一部分是响应码,响应内容,一部分是返回的数据,下面是一些基类
因为接口定义状态码与状态文本全都返回,而枚举值只能返回name属性的值,原始基类是这样定义的:
public class BaseResponse<T,D> extends BaseResult<T,D> {}
public class BaseResult<T, D>{
/**
* 响应状态以及状态文本
*/
private T resStatus;
/**
* 响应数据
*/
private D data;
public T getResStatus() {
return resStatus;
}
public void setResStatus(T resStatus) {
this.resStatus = resStatus;
}
public D getData() {
return data;
}
public void setData(D data) {
this.data = data;
}
}
我们的泛型T中放的是枚举类型Enum,但是在微服务feign调用的时候一直是解析失败,不能按照要求返回,所以对基类进行了改造
public class BaseResponse<T,D> extends BaseResult<T,D> {
}
public class BaseResult<T, D>{
/**
* 响应状态以及状态文本
*/
private EnumResult resStatus = new EnumResult();
/**
* 响应数据
*/
private D data;
public EnumResult getResStatus() {
return resStatus;
}
public void setResStatus(T t) {
IResStatus iResStatus = (IResStatus)t;
resStatus.setStatusText(iResStatus.getStatusText());
resStatus.setStatus(iResStatus.getStatus());
}
public D getData() {
return data;
}
public void setData(D data) {
this.data = data;
}
}
public interface IResStatus {
String getStatus();
String getStatusText();
}
public class EnumResult implements IResStatus {
/**
* 响应状态
*/
private String status;
/**
* 状态文本
*/
private String statusText;
@Override
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status =status;
}
@Override
public String getStatusText() {
return statusText;
}
public void setStatusText(String statusText) {
this.statusText = statusText;
}
}
UserResponse userResponse = userDemoFacede.getUser(param);
String resStatusJson = JsonUtils.obj2json(userResponse.getResStatus());
Map<String, String> resStatusMap = JsonUtils.json2pojo(resStatusJson, HashMap.class);
EnumResultCode enumGeneralResultCode = EnumResultCode.getUsersResultCodeByCode(resStatusMap.get("statusText"));
if (enumGeneralResultCode.equals(EnumGeneralResultCode.OK)) {
String url = (String) userResponse.getData();
}
UserResponse<EnumResult,String> userResponse = userDemoFacede.getUser(param);
EnumResult resStatus = userResponse.getResStatus();
if (resStatus.getStatus().equals(EnumResultCode.OK.getStatus())) {
String url = (String) userResponse.getData();
}