You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:48:02