java 泛型作为方法的返回值的封装
问题背景
业务需要,经常需要http方式调用某服务,然后某服务返回特定类型的返回内容。
类似 String resStr = xxxHttpClient.post() ,然后它返回一个字符串,你还需要反序列化成某种格式的。
返回值可以反序列化成的形式如下:
{private String code;private String message;//这里的这个“T”,就是根据具体业务需要而不同的类型,可能是一个class,也可能是一个List等private T data;
}
注意,这里的这个T是个活的,它可能根据接口的内容不同而不同。
- 有时候是个普通对象,如
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 泛型方法,返回泛型,完美封装* https://blog.csdn.net/qq_39348918/article/details/120529916*/
@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 = .....;//headersMap<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 = ...;//headersMap<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;
}
然后再使用就非常优雅了。
主要思想就是把想返回的数据类型,作为doPost 或 doPostForList的第三个参数传入,从而实现灵活控制接口返回类型的目的。
感觉效果不错,推荐使用。
相关文章:
java 泛型作为方法的返回值的封装
问题背景 业务需要,经常需要http方式调用某服务,然后某服务返回特定类型的返回内容。 类似 String resStr xxxHttpClient.post() ,然后它返回一个字符串,你还需要反序列化成某种格式的。 返回值可以反序列化成的形式如下&#…...
ASP.NET Core 中基于 Minimal APIs 的Web API
基于 Minimal APIs 的Web API Minimal APIs 是ASP.NET Core中快速构建 REST API 的方式,可以用最少的代码构建全功能的REST API。比如下面三行代码: var app WebApplication.Create(args); app.MapGet("/", () > "Hello World!&quo…...
Unity ProBuilder SetUVs 不起作用
ProBuilder SetUVs 不起作用 🐟 需要设置face.manulUV true public static void Set01UV(this ProBuilderMesh mesh){foreach (var face in mesh.faces){face.manualUV true;//设置为手动uv}var vertices mesh.GetVertices().Select(v > v.position).ToArray(…...
c#接口(interface)
概述: 在C#中,接口是一种定义了一组相关方法、属性和事件的规范。接口可以被类或结构体实现,以提供一种方式来定义类之间的契约或协议。 接口定义了一组成员,这些成员没有具体的实现。实现接口的类必须提供这些成员的具体实现。…...
SSH远程连接macOS服务器:通过cpolar内网穿透技术实现远程访问的设置方法
文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …...
【C++】Visual Studio EditorConfig 格式设置
【C】Visual Studio EditorConfig 格式设置 文章目录 【C】Visual Studio EditorConfig 格式设置I - EditorConfig1.1 - 通用设置indent_styleindent_sizetab_widthend_of_linecharsettrim_trailing_whitespaceinsert_final_newline II - Visual Studio 特定键值缩进设置cpp_in…...
服务器单机大规模数据存储方案
大规模数据存储都需要解决三个核心问题: 1.数据存储容量的问题,既然大数据要解决的是数据 PB 计的数据计算问题,而一般的服务器磁盘容量通常 1~2TB,那么如何存储这么大规模的数据呢? 2.数据读写速度的问题&…...
ElasticSearch-集成ik分词器
本文已收录于专栏 《中间件合集》 目录 背景介绍版本选择优势说明集成过程1.下载安装包2.解压安装包3.重启ElasticSearch服务3.1通过ps -ef | grep elastic查看正在启动的es进程号3.2使用kill -9 xxx 杀死进程3.3使用 ./elasticsearch 启动es服务 分词测试细粒度分词方式分词请…...
c++版opencv求二值图的质心
代码 #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>int main(int argc, char* argv[]) {cv::Mat input_image cv::imread("Untitled.png", cv::IMREAD_GRAYSCALE);cv:…...
6、深入解析Kotlin类与对象:构造、伴生、单例全面剖析
前言 本篇文章将带您了解Kotlin编程中的重要概念:类及构造函数、访问修饰符、伴生对象和单例模式。就像搭积木一样,我们会逐步揭开这些概念的面纱,让您轻松理解它们的作用和用法。无论您是编程新手还是有经验的开发者,本文都将为…...
【开源ESP32谷歌恐龙小游戏】【游戏演示和介绍】LVGL ST7789 适用于Arduino
【源码及教程地址-持续更新】 ESP32 C3 LVGL 迷你小电视 Google谷歌恐龙小游戏 1.9寸LCD显示屏开发板 ST7789 适用于Arduino开发板,教程,资料,程序,代码,PDF手册 【开源 & ESP32谷歌恐龙小游戏】【游戏演示和介绍】LVGL ST7789 适用于Arduin...
openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读
🧡💛💚💙💜OpenCV实战系列总目录 打印一个图片可以做出一个函数: def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 1、轮廓特征与近似 1.1 轮廓特征 前面我们计算了…...
cs231n_1_IntroToConv
参考的视频来自如下链接https://www.bilibili.com/video/BV1Ed4y1b7bm/ 参考笔记如下https://blog.csdn.net/TeFuirnever/article/details/89059673 x.1 CV历史 生物快速发展于5.4亿年前,那时的化石显示生物进化出了视觉,视觉使得生物多样性大爆炸。 …...
OPENCV实现SURF特征检测
1、SURF优点:SIFT速度慢,一次出现了SURF;2、使用SURF步骤:surf = cv2.xfeatures2d.SURF_create()kp,des = surf.detectAndComputer(img,mask)# -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/8/31 """# -*-...
Android Gradle 同步优化
作者:究极逮虾户 很多人听到方法论三个字,就觉得我要开始pua,说我阿里味,但是我觉得这个查问题的方式可能会对大家有点帮助。 很多人都会有这样的困扰,给你的一个工作内容是一个你完全陌生的东西,第一选择…...
BeautifulSoup:学习使用BeautifulSoup库进行HTML解析和数据提取。
BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以帮助我们从网页中提取数据,并以易于操作的方式进行分析。 以下是使用BeautifulSoup进行HTML解析和数据提取的基本语法: 安装BeautifulSoup库:首先,你需要在你的Python…...
基于沙猫群算法优化的BP神经网络(预测应用) - 附代码
基于沙猫群算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于沙猫群算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.沙猫群优化BP神经网络2.1 BP神经网络参数设置2.2 沙猫群算法应用 4.测试结果:5.Matlab代…...
PCL 判断三点共线(三维空间)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 继续之前的思路PCL 判断两条线段的平行性(三维空间),我们可以把判断三点共线看做是判断两条线段是否具有平行性,且这两条线段共用其中一个端点,基于此当这两条线段平行时,则证明这三点共线。 二、实现代码 /…...
【数据库】事务(概念和特点)
一、 什么是事务: 事务是在数据库中执行的一系列操作单元,这些操作要么全部成功提交,要么全部失败回滚。 二、事务的特点: 原子性(Atomicity):事务是一个不可分割的操作单元,要么…...
LA@齐次线性方程组解的结构
文章目录 齐次线性方程组解的结构🎈解的性质齐次线性方程组的解的线性组合还是方程组的解基础解系通解 定理:齐次线性方程组基础解系存在定理齐次线性方程组的基础解系包含的向量个数(秩)👺应用和示例推论1推论2推论3:转置矩阵对的乘积秩的性质非自由未知…...
从欧氏距离到余弦相似度:5种距离度量如何影响你的KNN模型?用Scikit-learn实战对比
从欧氏距离到余弦相似度:5种距离度量如何影响你的KNN模型?用Scikit-learn实战对比 在机器学习的世界里,K近邻算法(KNN)因其简单直观而广受欢迎。但很多实践者往往只关注k值的选择,却忽略了另一个同等重要的超参数——距离度量。就…...
Midjourney材质质感翻车实录(金属发灰/皮革失真/玻璃无折射):基于1372组AB测试的材质Token黄金配比公式
更多请点击: https://kaifayun.com 第一章:Midjourney材质表现方法论总纲 Midjourney 作为以语义驱动的图像生成模型,其对材质(Texture)的表达并非依赖显式参数控制,而是通过提示词(Prompt&…...
openpilot深度解析:开源驾驶辅助系统的技术实现与架构设计
openpilot深度解析:开源驾驶辅助系统的技术实现与架构设计 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Tre…...
ODS怎么转PDF?5种转换方法对比与2026实测工具推荐
当你拿到OpenDocument电子表格(ODS格式)文件,却需要分享成PDF格式时,转换往往成为一个必要步骤。ODS是LibreOffice等开源办公套件的标准格式,具有高度兼容性和数据完整性,但在跨平台分享和打印时࿰…...
如何用嘎嘎降AI处理管理学论文:管理学研究生毕业论文降AI4.8元完整操作教程
如何用嘎嘎降AI处理管理学论文:管理学研究生毕业论文降AI4.8元完整操作教程 关于管理学论文降AI教程,有几个细节提前知道能少走很多弯路。 核心用嘎嘎降AI(www.aigcleaner.com),4.8元,达标率99.26%。这篇…...
Perplexity生物检索黄金公式:[实体]+[关系]+[证据等级]+[时间窗]——经Nature子刊12篇方法论论文交叉验证
更多请点击: https://intelliparadigm.com 第一章:Perplexity生物检索黄金公式的提出与演进 Perplexity生物检索黄金公式(Perplexity-Bio Retrieval Golden Formula, PBRGF)并非源于单一论文,而是随着跨模态生物语义建…...
从模型文件到孪生场景:一个Three.js三维模型管理系统的完整产品化思考
从技术原型到商业产品:构建Three.js数字孪生系统的全栈实践 在数字孪生技术快速渗透工业制造、智慧城市等领域的今天,如何将一个基于Three.js的模型展示Demo转化为真正具备商业价值的企业级管理系统?这个问题困扰着许多掌握前端3D技术的开发者…...
3分钟学会:如何用Chrome扩展一键保存完整网页内容
3分钟学会:如何用Chrome扩展一键保存完整网页内容 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension…...
告别快捷键混乱!PowerToys保姆级教程:让Win键位秒变Mac,开发效率翻倍
告别快捷键混乱!PowerToys保姆级教程:让Win键位秒变Mac,开发效率翻倍 作为一名长期在Windows和Mac双平台切换的开发者,最令人抓狂的莫过于快捷键的差异。每次从Mac切换到Windows,肌肉记忆总会在关键时刻背叛你——当你…...
BarTender如何在线刷新许可证
1、在BarTender服务端打开Administration Console注意:此操作需要服务端连接外网,登录本地管理员账户2、点击许可并等待右侧弹出许可证界面选中需要操作的许可证并点击右侧刷新按钮3、许可证刷新成功4、刷新完成后观察刷新后的许可证前方是否有感叹号如果…...
