如何用Java泛型实现通用分页响应类(避免重复代码)
通用分页响应类的正确泛型实现与使用方式
核心泛型类实现
把分页公共字段(总条数、页码、每页大小等)抽离到泛型类中,用泛型参数T指代data数组内的具体对象类型,就能彻底复用分页逻辑,避免重复代码。
Java 示例(配合Spring/Lombok简化)
import lombok.Data; import java.util.List; @Data // Lombok注解自动生成getter/setter、构造方法等 public class DataWithCount<T> { // 分页公共字段 private long totalCount; private int page; private int pageSize; // 泛型数据列表,T可替换为任意实体类(Person/Animal等) private List<T> data; }
C# 示例
public class DataWithCount<T> { public long TotalCount { get; set; } public int Page { get; set; } public int PageSize { get; set; } public List<T> Data { get; set; } }
实际使用方式
在API接口中返回泛型响应
以Spring Boot为例,直接用泛型类替代之前的PersonWithCount/AnimalWithCount:
@GetMapping("/persons") public ResponseEntity<DataWithCount<Person>> getPersons( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int pageSize) { // 业务查询:获取总条数和分页数据 long total = personService.countAll(); List<Person> personList = personService.findPage(page, pageSize); // 组装泛型响应 DataWithCount<Person> response = new DataWithCount<>(); response.setTotalCount(total); response.setPage(page); response.setPageSize(pageSize); response.setData(personList); return ResponseEntity.ok(response); }
如果是C# ASP.NET Core:
[HttpGet("animals")] public IActionResult GetAnimals(int page = 1, int pageSize = 10) { var total = _animalService.GetTotalCount(); var animalList = _animalService.GetPagedData(page, pageSize); var response = new DataWithCount<Animal> { TotalCount = total, Page = page, PageSize = pageSize, Data = animalList }; return Ok(response); }
常见问题解决
如果遇到JSON序列化/反序列化失败(无法识别泛型类型):
- Java Jackson:手动反序列化时需用
TypeReference指定泛型具体类型:String json = "..."; // API返回的JSON字符串 ObjectMapper mapper = new ObjectMapper(); DataWithCount<Person> result = mapper.readValue( json, new TypeReference<DataWithCount<Person>>() {} ); - C# Newtonsoft.Json:直接指定泛型类型反序列化:
string json = "..."; var result = JsonConvert.DeserializeObject<DataWithCount<Animal>>(json);
内容的提问来源于stack exchange,提问作者Andrej
相关产品推荐
相关产品推荐

