首页 > 编程语言 >java 泛型作为方法的返回值的封装

java 泛型作为方法的返回值的封装

时间:2023-09-07 16:34:17浏览次数:42  
标签:java String List private params import 泛型 返回值 class


问题背景

业务需要,经常需要http方式调用某服务,然后某服务返回特定类型的返回内容。
类似 String resStr = xxxHttpClient.post() ,然后它返回一个字符串,你还需要反序列化成某种格式的。

返回值可以反序列化成的形式如下:

{
	 private String code;

    private String message;

	//这里的这个“T”,就是根据具体业务需要而不同的类型,可能是一个class,也可能是一个List等
    private T data;
}

注意,这里的这个T是个活的,它可能根据接口的内容不同而不同。

  1. 有时候是个普通对象,如
public class StudentInfo{
	private Integer age;
	private String name;		
}

这样。
2. 有时候是个List,如 List<StudentInfo> 这样
3. 有时候是个嵌套对象,如:

public class StudentInfo{
	private Integer pageNum;
	private Integer pageSize;
	private Integer totalCount;
	private List<StudentInfo> list;		
}

这样。

甚至更多种情况,那么,要怎么办呢?
还挺不好写活的。

封装了一个方法,实现上述功能

(已删除若干不相干代码,不影响含义)

import cn.xxx.dto.BaseCommonResDTO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @author 
 * @date 2023年8月25日
 * @desc 泛型方法,返回泛型,完美封装
 * 
 */
@Slf4j
@Component
public class MyCustomHttp {

    /**
     * 返回数据类型
     * 其中T是xxx的htttp接口返回的数据的类型
     *
     * @param url
     * @param params
     * @return
     */
    public <T extends Object> T doPost(String url, Map<String, String> params, Class<T> clazz) {

        //当前时间戳

        Long timestamp = System.currentTimeMillis();

        String sign = .....;

        //headers
        Map<String, String> heads = ...;


        ResponseBody responseBody = myXXHttpClient.doPost(url, heads, params);

        String responseMsg = responseBody.getResponseMsg();

        //普通反序列化
        //MyDataResDTO myDataResDTO = JSONObject.parseObject(reposeBody.getResponseMsg(), MyDataResDTO.class);

        //嵌套类反序列化
        BaseCommonResDTO<T> result = JSONObject.parseObject(responseMsg, new TypeReference<BaseCommonResDTO<T>>(clazz) {
        });

        if (null != result) {
            T data = result.getData();
            return data;
        } else {
            return null;
        }
    }

    public <T extends Object> List<T> doPostForList(String url, Map<String, String> params, Class<T> clazz) {

        //当前时间戳

        Long timestamp = System.currentTimeMillis();

        String sign = ...;

        //headers
        Map<String, String> heads = ...;

        ResponseBody responseBody =myXXHttpClient.doPost(url, heads, params);

        String responseMsg = responseBody.getResponseMsg();

        //普通反序列化
        //MyDataResDTO myDataResDTO = JSONObject.parseObject(reposeBody.getResponseMsg(), MyDataResDTO.class);

        //嵌套类反序列化
        BaseCommonResDTO<List<T>> result = JSONObject.parseObject(responseMsg, new TypeReference<BaseCommonResDTO<List<T>>>(clazz) {
        });

        if (null != result) {
            List<T> data = result.getData();
            return data;
        } else {
            return null;
        }
    }
}

使用举例

调用的时候

//返回对象 (包括返回普通对象 和  返回嵌套对象,都亲测成功)
public StudentInfo getStudentInfo (Integer page, Integer pageSize) {

    Map<String, String> params = Maps.newHashMap();
    params.put("param1", page);
    params.put("param2", pageSize);

    StudentInfo studentInfo = MyCustomHttp.doPost(url, params, StudentInfo.class);

    return studentInfo;
}


//返回list
public List<StudentInfo> getAllStudentInfos(Integer page, Integer pageSize) {

    Map<String, String> params = Maps.newHashMap();
    params.put("param1", page);
    params.put("param2", pageSize);

    List<StudentInfo> studentInfos= MyCustomHttp.doPostForList(url, params, StudentInfo.class);

    return studentInfos;
}

然后再使用就非常优雅了。
主要思想就是把想返回的数据类型,作为doPostdoPostForList的第三个参数传入,从而实现灵活控制接口返回类型的目的。
感觉效果不错,推荐使用。


标签:java,String,List,private,params,import,泛型,返回值,class
From: https://blog.51cto.com/u_15782374/7398534

相关文章

  • 开心农场java国外版开发
      开心农场属于是国内的游戏养殖平台,但是也可以开发成国外的模式,首先就是玩法和语言上的区别。该软件问世以来,也是以java的模式传播开的,受到了众多爱好者的欢迎,游戏界面以经典前卫的形式出现。  在开发java版的国际开心农场软件时,开发软件的团队也是借鉴了原版的模型开发......
  • Java Heapprof文件分析工具MAT(memory analyzer tool )
    在分析内存时经常会遇到一些内存泄漏的问题,可以有不知道那个导致的内存泄漏,此时通常抓取一个JavaHeapprof文件,adbshellamdumpheap包名/data/local/tmp/1.hprof 下面下载MAT工具:https://eclipse.dev/mat/downloads.php解压出来如下: 运行MemoryAnalyzer.exe软件发现......
  • 【Java基础增强】Stream流
    1.Stream流1.1体验Stream流【理解】案例需求按照下面的要求完成集合的创建和遍历创建一个集合,存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集合原始方式示例代码publicclassMyStream1......
  • 【Java基础增强】类加载器和反射
    1.类加载器1.1类加载器【理解】作用负责将.class文件(存储的物理文件)加载在到内存中1.2类加载的过程【理解】类加载时机创建类的实例(对象)调用类的类方法访问类或者接口的类变量,或者为该类变量赋值使用反射方式来强制创建某个类或接口对应的java.lang.Class对象初始化某个类的子类直......
  • JavaScript入门---计算机基础
         编程语言通过翻译器翻译成机器语言让机器执行 标记被动,编程有逻辑是主动。二。计算机基础硬件:输入设备、输出设备、cpu(处理数据与运算)、硬盘、内存 软件:系统软件,应用软件包含于sys软件2.1数据存储计算机内部由01表示数据硬盘内存都是保存二进制数......
  • java反射
    直接new对象就叫正射如下Map<String,String>map=newHashMap<>();map.put("两年半","唱跳rap篮球");正射,LinkedHashMap效果更好,然后你修改代码Map<String,String>map=newLinkedHashMap<>();map.put("两年半","唱跳rap篮球");发现用Linke......
  • java http传参及使用的注解
    javahttp传参及使用的注解:TTP协议组成协议内容示例对应Spring注解pathinfo传参/articles/12(查询id为12的文章,12是参数)@PathVariableURLQueryString传参/articles?id=12@RequestParamBody传参Content-Type:multipart/form-data@RequestParamBod......
  • IDEA编译报错:maven-resources-production:guyi-admin: java.lang.IndexOutOfBoundsExc
    编译项目的时候,IDEA一直提示:maven-resources-production:xxxxxx:java.lang.IndexOutOfBoundsException:Range[-1,-1+1025)outofboundsforlength1024,maven-resources-production:xxxxxx:java.lang.IndexOutOfBoundsException:Range[-1,-1+1025)outofboundsfor......
  • 视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现)
    //视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现)importjava.util.ArrayList;importjava.util.List;publicclassVideoProcess{System.out.println(oldfilepath+"->"+newfilename+"->"+newimg);List<String>commen......
  • 用javascript修改下拉框中的selected值
    functionchangeSelected(selValue){varobj=document.getElementById("selectname");for(vari=0;i<obj.length;i++){obj.options[i].selected=false;if(obj.options[i].value==selValue){obj.opti......