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

数据库存在数据但/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值,对比是否完全一致(注意大小写、特殊字符等细节)。
  • 验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:02:14