因为一直比较忙,所以在项目创建以后一直在些业务部分,没有关注过项目架构本身的问题,今天抽时间记录一下,博主的项目采用的是基于springcloud的前后端分离的微服务项目,因为也是第一次搞这样的项目,经验不足,在前后端交互问题上没有涉及的很好,导致项目成员在编写代码时总会遇到下面的这些问题,接下来一一介绍.
我的公众号
前后端项目的好处不用多说,前端与后端约定好接口参数,这样前后端只需要完成业务以后测试就可以了,前端不需要等待后端的接口完成,前后端可以同步工作,大大提高了开发效率,但是在后端接口定义的时候,一般会有一些基类,这些基类如果设计的比较好的话,可以大大的节省开发时间,减少bug的产生,我们项目的接口定义主要由两部分组成,一部分是响应码,响应内容,一部分是返回的数据,下面是一些基类
因为接口定义状态码与状态文本全都返回,而枚举值只能返回name属性的值,原始基类是这样定义的:
- BaseResponse 类
public class BaseResponse<T,D> extends BaseResult<T,D> {}
- BaseResult
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调用的时候一直是解析失败,不能按照要求返回,所以对基类进行了改造
- BaseResponse 不需要改
public class BaseResponse<T,D> extends BaseResult<T,D> {
}
- BaseResult基类进行改造
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;
}
}
- 新增 IResStatus,并添加Enum需要返回的类的属性方法
public interface IResStatus {
String getStatus();
String getStatusText();
}
- 新增EnumResult,并实现IResStatus
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;
}
}
- 这样设计的好处就是比原来更加灵活,而且可以返回自己想要的数据,再来看一段,前端微服务用feign调用基础服务时没改之前的demo段,服务之间调用增加了很多逻辑上的判断,很容易引入bug
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();
}
- 再看改造后的方法,代码简化了很多,EnumResult巧妙的通过接口找到实现类,并返回实现类里的真实数据,是不是感觉顿时清爽了很多,既极少了代码量,降低bug率,而且提升了开发效率,项目速度也得到了提升,一举多得
UserResponse<EnumResult,String> userResponse = userDemoFacede.getUser(param);
EnumResult resStatus = userResponse.getResStatus();
if (resStatus.getStatus().equals(EnumResultCode.OK.getStatus())) {
String url = (String) userResponse.getData();
}
- 如果有朋友还在疑惑springcloud中使用feign出现LinkedHashMap can not be cast to xxx ,看我上一篇文章,有提供解决方案,好了结束,下次再会