Spring Boot查询过滤器如何捕获错误返回空列表而非404状态码
Spring Boot查询接口空匹配返回逻辑调整方案
问题场景
基于Spring Boot开发的光伏板位置查询过滤器,支持通过externalId或名称模糊检索,输入合法过滤条件时可正常返回结果,输入无匹配的过滤条件时接口返回404错误,期望调整为匹配不到结果时返回空列表。
现有代码实现
Controller层
@Override public ResponseEntity<List<SolarPanelLocation>> getSolarPanelLocationsByIdAndName(String solarPanelNameAndExternalId) { return ResponseEntityBuilderUtils.ok(solarPanelService.getSolarPanelFilterByExternalIdAndSolarPanelName(solarPanelNameAndExternalId)); }
Service层
@Override public List<SolarPanelLocation> getSolarPanelFilterByExternalIdAndSolarPanelName(String solarPanelNameAndExternalId) { if (solarPanelNameAndExternalId == null) { throw new MissingValueException("The externalId or solarPanelName are required"); } final List<SolarPanelLocationEntityView> solarPanelLocationEntityListFilter = solarPanelLocationDAO.filterSolarPanelList( solarPanelNameAndExternalId); if (solarPanelLocationEntityListFilter == null) { throw new NoSuchElementFoundException("Structure Group Location list not available"); } if (solarPanelLocationEntityListFilter.isEmpty()) { throw new NoSuchElementFoundException("Solar Panel Location list not available"); } return solarPanelLocationMapper.map(solarPanelLocationEntityListFilter); }
DAO层查询逻辑
@Query("SELECT d FROM SolarPanelLocationEntityView d WHERE d.externalId LIKE %:#{#filterCriteria}% OR lower(d.solarPanelName) LIKE lower(concat('%',:filterCriteria,'%')) ") List<SolarPanelLocationEntityView> filterSolarPanelList(@Param("filterCriteria") String filterCriteria);
原错误返回结果
{ "status": 404, "message": "Solar Panel Location list not availablen" }
修复方案
问题根源是Service层判断查询结果为空列表时主动抛出了NoSuchElementFoundException,该异常被全局异常处理器映射为404状态码返回。只需修改空列表判断逻辑,不再抛出异常,直接返回空列表即可:
// 删除原有抛异常逻辑,替换为返回空列表 if (solarPanelLocationEntityListFilter.isEmpty()) { return List.of(); }
修改后无匹配结果时接口会直接返回200状态码+空列表,符合需求。
内容的提问来源于stack exchange,提问作者Doncarlito87
相关产品推荐
相关产品推荐

