当前位置: 首页 > news >正文

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

问题背景

业务需要,经常需要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 泛型方法,返回泛型,完美封装* 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;
}

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

相关文章:

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

问题背景 业务需要&#xff0c;经常需要http方式调用某服务&#xff0c;然后某服务返回特定类型的返回内容。 类似 String resStr xxxHttpClient.post() &#xff0c;然后它返回一个字符串&#xff0c;你还需要反序列化成某种格式的。 返回值可以反序列化成的形式如下&#…...

ASP.NET Core 中基于 Minimal APIs 的Web API

基于 Minimal APIs 的Web API Minimal APIs 是ASP.NET Core中快速构建 REST API 的方式&#xff0c;可以用最少的代码构建全功能的REST API。比如下面三行代码&#xff1a; var app WebApplication.Create(args); app.MapGet("/", () > "Hello World!&quo…...

Unity ProBuilder SetUVs 不起作用

ProBuilder SetUVs 不起作用 &#x1f41f; 需要设置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)

概述&#xff1a; 在C#中&#xff0c;接口是一种定义了一组相关方法、属性和事件的规范。接口可以被类或结构体实现&#xff0c;以提供一种方式来定义类之间的契约或协议。 接口定义了一组成员&#xff0c;这些成员没有具体的实现。实现接口的类必须提供这些成员的具体实现。…...

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…...

服务器单机大规模数据存储方案

大规模数据存储都需要解决三个核心问题&#xff1a; 1.数据存储容量的问题&#xff0c;既然大数据要解决的是数据 PB 计的数据计算问题&#xff0c;而一般的服务器磁盘容量通常 1&#xff5e;2TB&#xff0c;那么如何存储这么大规模的数据呢&#xff1f; 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编程中的重要概念&#xff1a;类及构造函数、访问修饰符、伴生对象和单例模式。就像搭积木一样&#xff0c;我们会逐步揭开这些概念的面纱&#xff0c;让您轻松理解它们的作用和用法。无论您是编程新手还是有经验的开发者&#xff0c;本文都将为…...

【开源ESP32谷歌恐龙小游戏】【游戏演示和介绍】LVGL ST7789 适用于Arduino

【源码及教程地址-持续更新】 ESP32 C3 LVGL 迷你小电视 Google谷歌恐龙小游戏 1.9寸LCD显示屏开发板 ST7789 适用于Arduino开发板,教程,资料,程序,代码,PDF手册 【开源 & ESP32谷歌恐龙小游戏】【游戏演示和介绍】LVGL ST7789 适用于Arduin...

openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读

&#x1f9e1;&#x1f49b;&#x1f49a;&#x1f499;&#x1f49c;OpenCV实战系列总目录 打印一个图片可以做出一个函数&#xff1a; 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亿年前&#xff0c;那时的化石显示生物进化出了视觉&#xff0c;视觉使得生物多样性大爆炸。 …...

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 同步优化

作者&#xff1a;究极逮虾户 很多人听到方法论三个字&#xff0c;就觉得我要开始pua&#xff0c;说我阿里味&#xff0c;但是我觉得这个查问题的方式可能会对大家有点帮助。 很多人都会有这样的困扰&#xff0c;给你的一个工作内容是一个你完全陌生的东西&#xff0c;第一选择…...

BeautifulSoup:学习使用BeautifulSoup库进行HTML解析和数据提取。

BeautifulSoup是一个用于解析HTML和XML文档的Python库。它可以帮助我们从网页中提取数据&#xff0c;并以易于操作的方式进行分析。 以下是使用BeautifulSoup进行HTML解析和数据提取的基本语法&#xff1a; 安装BeautifulSoup库&#xff1a;首先&#xff0c;你需要在你的Python…...

基于沙猫群算法优化的BP神经网络(预测应用) - 附代码

基于沙猫群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于沙猫群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.沙猫群优化BP神经网络2.1 BP神经网络参数设置2.2 沙猫群算法应用 4.测试结果&#xff1a;5.Matlab代…...

PCL 判断三点共线(三维空间)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 继续之前的思路PCL 判断两条线段的平行性(三维空间),我们可以把判断三点共线看做是判断两条线段是否具有平行性,且这两条线段共用其中一个端点,基于此当这两条线段平行时,则证明这三点共线。 二、实现代码 /…...

【数据库】事务(概念和特点)

一、 什么是事务&#xff1a; 事务是在数据库中执行的一系列操作单元&#xff0c;这些操作要么全部成功提交&#xff0c;要么全部失败回滚。 二、事务的特点&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是一个不可分割的操作单元&#xff0c;要么…...

LA@齐次线性方程组解的结构

文章目录 齐次线性方程组解的结构&#x1f388;解的性质齐次线性方程组的解的线性组合还是方程组的解基础解系通解 定理:齐次线性方程组基础解系存在定理齐次线性方程组的基础解系包含的向量个数(秩)&#x1f47a;应用和示例推论1推论2推论3:转置矩阵对的乘积秩的性质非自由未知…...

深入解析DDR内存训练:从FLY BY布线到信号对齐

1. 为什么DDR内存需要训练&#xff1f; 当你按下电脑开机键的那一刻&#xff0c;主板上的DDR内存就开始了一段奇妙的"热身运动"。这个热身过程专业术语叫做内存训练&#xff08;Memory Training&#xff09;&#xff0c;它是确保内存稳定运行的关键步骤。想象一下&a…...

Bunker_mini_dev实战:多雷达(AVIA MID360)ROS1驱动融合与rviz点云同屏可视化

1. 多雷达ROS1驱动融合实战背景 最近在Bunker_mini_dev机器人开发平台上折腾多激光雷达融合&#xff0c;发现不少开发者对Livox AVIA和MID360这两款雷达的ROS1驱动配置存在困惑。我自己踩过不少坑&#xff0c;今天就把从驱动安装到rviz同屏显示的全流程梳理一遍。这种配置在自动…...

构建高性能语音识别API:FastAPI与Whisper实战指南 [特殊字符]

构建高性能语音识别API&#xff1a;FastAPI与Whisper实战指南 &#x1f680; 【免费下载链接】awesome-fastapi A curated list of awesome things related to FastAPI 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-fastapi 在当今人工智能和语音技术飞速发展的…...

SAP FI年结总账余额结转(FAGLGVTR/F.16)详细注意事项

SAP FI年结总账余额结转&#xff08;FAGLGVTR/F.16&#xff09;详细注意事项一、执行前注意事项&#xff08;核心前提&#xff0c;必查&#xff09;1. 基础配置与账期检查&#xff08;重中之重&#xff09;账期管理&#xff1a;必须通过事务码OB52&#xff0c;确认旧年度1-12期…...

NeMo Voice Agent:零代码构建企业级语音助手的三步解决方案

NeMo Voice Agent&#xff1a;零代码构建企业级语音助手的三步解决方案 【免费下载链接】NeMo NVIDIA/NeMo: 是一个用于实现语音和自然语言处理的开源框架。适合在需要进行语音和自然语言处理的任务中使用。特点是提供了一种简单、易用的 API&#xff0c;支持多种语音和自然语言…...

攻克Windows安装难题:AtlasOS全方位解决2502/2503错误的技术方案

攻克Windows安装难题&#xff1a;AtlasOS全方位解决2502/2503错误的技术方案 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Tren…...

7个革新性的REFramework应用技巧:游戏开发者的效率提升指南

7个革新性的REFramework应用技巧&#xff1a;游戏开发者的效率提升指南 【免费下载链接】REFramework REFramework 是 RE 引擎游戏的 mod 框架、脚本平台和工具集&#xff0c;能安装各类 mod&#xff0c;修复游戏崩溃、卡顿等问题&#xff0c;还有开发者工具&#xff0c;让游戏…...

Changedetection.io网页监控工具:免费开源网站变更检测终极指南

Changedetection.io网页监控工具&#xff1a;免费开源网站变更检测终极指南 【免费下载链接】changedetection.io The best and simplest free open source website change detection, website watcher, restock monitor and notification service. Restock Monitor, change de…...

3个实用技巧让你轻松掌握Unity游戏插件框架BepInEx

3个实用技巧让你轻松掌握Unity游戏插件框架BepInEx 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为一款功能强大的Unity游戏插件框架&#xff0c;为玩家和开发者提供了…...

C++的std--ranges适配器视图元素类型推导规则与用户自定义类型

C20引入的std::ranges库彻底改变了序列操作的范式&#xff0c;其中适配器视图通过惰性求值和管道操作符实现了高效的函数式编程。当开发者尝试将用户自定义类型融入这套体系时&#xff0c;元素类型推导的复杂规则往往成为技术深水区。本文将揭示适配器视图背后的类型魔法&#…...