今天遇到一个非典型性的需求,要写一个新的方法,其方法实现与已经实现了的一个老方法是一模一样的,但两个方法的入参和返回值都是相同的只是名称不同而已。要求必须写成两个方法,并携带各自的入参和返回值。那要怎么做呢?有几种方法?最简单的是,首先将新方法的入参和返回值转成和老方法一样的再在新方法中调用老方法。
老方法如下:
public QueryFeedCommentsResponse queryFeedComments(QueryFeedCommentsRequest queryFeedCommentsRequest) {
......
}
新方法如下:
public QueryFeedDetailResponse queryFeedDetail(QueryFeedDetailRequest queryFeedDetailRequest) {
//1.将入参queryFeedDetailRequest转换成queryFeedCommentsRequest
JSONObject jsonObject = JSONObject.fromObject(queryFeedDetailRequest);
QueryFeedCommentsRequest queryFeedCommentsRequest =(QueryFeedCommentsRequest)JSONObject.toBean(jsonObject, QueryFeedCommentsRequest.class);
//2.调用老方法
QueryFeedCommentsResponse queryFeedCommentsResponse = queryFeedComments(queryFeedCommentsRequest);
//3.将返回值 queryFeedCommentsResponse 转换成QueryFeedDetailResponse
JSONObject jsonObject2 = JSONObject.fromObject(queryFeedCommentsResponse);
QueryFeedDetailResponse queryFeedDetailResponse =(QueryFeedDetailResponse)JSONObject.toBean(jsonObject2, QueryFeedDetailResponse.class);
}
原则上说这样是可以的,但是在从老方法的返回值转成新方法的返回值时遇到了json转换方面的报错:
java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.nvshen.api.domain.feed.FeedCommentComponent
为什么呢?如果返回值QueryFeedDetailResponse包含的都是普通类型的,那这样转换就没有任何问题,但QueryFeedDetailResponse却是这样的:
public class QueryFeedDetailResponse{
public List<FeedCommentComponent> commentList;
public String pageNo;
public String totalPage;
public List<FeedCommentComponent> getCommentList() {
return commentList;
}
public void setCommentList(List<FeedCommentComponent> commentList) {
this.commentList = commentList;
}
public String getPageNo() {
return pageNo;
}
public void setPageNo(String pageNo) {
this.pageNo = pageNo;
}
public String getTotalPage() {
return totalPage;
}
public void setTotalPage(String totalPage) {
this.totalPage = totalPage;
}
}
正是因为QueryFeedDetailResponse中含有List型的元素,那要如何解决呢?
public QueryFeedDetailResponse queryFeedDetail(QueryFeedDetailRequest queryFeedDetailRequest) throws NvshenException {
JSONObject jsonObject = JSONObject.fromObject(queryFeedDetailRequest);
QueryFeedCommentsRequest queryFeedCommentsRequest =(QueryFeedCommentsRequest)JSONObject.toBean(jsonObject, QueryFeedCommentsRequest.class);
QueryFeedCommentsResponse queryFeedCommentsResponse = queryFeedComments(queryFeedCommentsRequest);
//3.将返回值 queryFeedCommentsResponse 转换成QueryFeedDetailResponse
JSONObject jsonObject2 = JSONObject.fromObject(queryFeedCommentsResponse);
Map<String, Class> classMap = new HashMap<String, Class>();
classMap.put("commentList", FeedCommentComponent.class);
QueryFeedDetailResponse queryFeedDetailResponse=(QueryFeedDetailResponse) JSONObject.toBean(jsonObject2, QueryFeedDetailResponse.class, classMap);
return queryFeedDetailResponse;
}
这样就转化ok了。