数据库存在数据但/getSongTitleById接口返回NOT_FOUND状态求助
问题排查请求
MongoDB已正常连接,数据库中存在对应数据,但调用/getSongTitleById/{songId}接口时,POSTMAN测试显示HTTP状态码为200 OK,但响应体的status字段却为NOT_FOUND。其他接口如addSong、deleteSongById均可正常工作。
接口控制器代码
@GetMapping(value = "/getSongTitleById/{songId}") public @ResponseBody Map<String, Object> getSongTitleById(@PathVariable("songId") String songId, HttpServletRequest request) { Map<String, Object> response = new HashMap<String, Object>(); response.put("path", String.format("GET %s", Utils.getUrl(request))); DbQueryStatus dbQueryStatus = songDal.getSongTitleById(songId); response.put("message", dbQueryStatus.getMessage()); response = Utils.setResponseStatus(response, dbQueryStatus.getdbQueryExecResult(), dbQueryStatus.getData()); return response; }
Utils.java代码
package com.csc301.songmicroservice; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.http.HttpStatus; import okhttp3.RequestBody; public class Utils { public static RequestBody emptyRequestBody = RequestBody.create("",null); // Used to determine path that was called from within each REST route, you don't // need to modify this public static String getUrl(HttpServletRequest req) { String requestUrl = req.getRequestURL().toString(); String queryString = req.getQueryString(); if (queryString != null) { requestUrl += "?" + queryString; } return requestUrl; } // Sets the response status and data for a response from the server. You will // not always be able to use this function public static Map<String, Object> setResponseStatus(Map<String, Object> response, DbQueryExecResult dbQueryExecResult, Object data) { switch (dbQueryExecResult) { case QUERY_OK: response.put("status", HttpStatus.OK); if (data != null) { response.put("data", data); } break; case QUERY_ERROR_NOT_FOUND: response.put("status", HttpStatus.NOT_FOUND); break; case QUERY_ERROR_GENERIC: response.put("status", HttpStatus.INTERNAL_SERVER_ERROR); break; } return response; } }
排查方向
- 检查
songDal.getSongTitleById的查询逻辑:- 确认MongoDB中存储的
_id类型:如果是ObjectId,传入的字符串songId需要先转换为ObjectId再查询,直接用字符串匹配会导致查询不到数据。 - 打印传入的
songId和数据库中实际的_id值,对比是否完全一致(注意大小写、特殊字符等细节)。
- 确认MongoDB中存储的
- 验证
DbQueryStatus的赋值逻辑:- 确认查询到数据时,
getSongTitleById是否正确将dbQueryExecResult设置为QUERY_OK,而非错误返回QUERY_ERROR_NOT_FOUND。 - 调试时查看
dbQueryStatus的所有字段值(message、dbQueryExecResult、data),确认是否符合预期。
- 确认查询到数据时,
- HTTP状态码与响应体的一致性问题:
- 当前接口通过
@ResponseBody返回Map,Spring默认返回200状态码,响应体中的status是自定义字段。若需要让HTTP状态码与响应体status一致,需在接口中添加@ResponseStatus注解,或通过HttpServletResponse手动设置状态码。
- 当前接口通过
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

