JPA查询无结果时如何用lambda处理空值返回自定义错误响应
实现方案
你不需要修改现有DAO层代码,只需在业务层或控制层借助Optional+lambda表达式即可实现空值防护、空列表分支处理,无需编写显式if判空逻辑,具体实现如下:
1. 先定义统一响应封装类
用于统一接口返回格式,序列化后完全匹配你需要的JSON结构:
public class CommonResponse<T> { private Integer code; private String message; private T data; // 全参构造方法 public CommonResponse(Integer code, String message, T data) { this.code = code; this.message = message; this.data = data; } // 成功响应静态方法,带返回数据 public static <T> CommonResponse<T> success(T data) { return new CommonResponse<>(200, "The operation was successful.", data); } // 失败响应静态方法 public static <T> CommonResponse<T> fail(Integer code, String message) { return new CommonResponse<>(code, message, null); } // getter、setter省略 }
2. 业务层逻辑实现
import java.util.Optional; import java.util.stream.Collectors; // Service层方法 public CommonResponse<List<FileDetailResponseDto>> queryFileDetailByPhone(String phoneNumber) { // 调用现有DAO方法获取查询结果 List<FileDetail> resultList = fileDetailDao.getByPhoneNumberCBVersion(phoneNumber); return Optional.ofNullable(resultList) // 过滤空列表场景,空列表会让Optional变为空 .filter(list -> !list.isEmpty()) // 有匹配数据时,用lambda将实体类转为DTO,封装成功响应 .map(list -> { List<FileDetailResponseDto> dtoList = list.stream() .map(this::convertToDetailDto) .collect(Collectors.toList()); return CommonResponse.success(dtoList); }) // 无数据/空列表时,用lambda返回指定错误响应 .orElseGet(() -> CommonResponse.fail(400, "Unfortunately, no information was found for this number.")); } // FileDetail实体转DTO的方法,按你的实际字段调整即可 private FileDetailResponseDto convertToDetailDto(FileDetail detail) { FileDetailResponseDto dto = new FileDetailResponseDto(); dto.setPhoneNumber(detail.getPhoneNumber()); dto.setTextMessage(detail.getTextMessage()); dto.setCreateDateTime(detail.getCreateDateTime()); dto.setSender(detail.getSender()); dto.setStatus(detail.getStatus()); dto.setOriginatry(detail.getOriginatry()); return dto; }
实现说明
Optional.ofNullable(resultList)首先规避了DAO返回null的空指针风险- 所有分支逻辑都通过lambda表达式实现,无需编写任何if/else判空代码
- 序列化后自动匹配你需要的两种响应格式:有数据时会携带
fileDetailResponseDtos数组,无数据时仅返回code和message字段
内容的提问来源于stack exchange,提问作者iwritecomeinmymind
相关产品推荐
相关产品推荐

