在 ResponseEntity 正文中返回 null (Spring Boot RESTful)

Posted

技术标签:

【中文标题】在 ResponseEntity 正文中返回 null (Spring Boot RESTful)【英文标题】:Return null in ResponseEntity body (Spring Boot RESTful) 【发布时间】:2018-03-14 03:44:29 【问题描述】:

我正在创建一个具有以下可用服务的 RESTFul Web 服务:

@RequestMapping(value = "/test", produces = "application/json", method = RequestMethod.GET)
public ResponseEntity<List<GenericModel>> returnEmpty() 
    List<GenericModel> genericModelList = new ArrayList<>();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");

    return responseEntity = new ResponseEntity<>(genericModelList, headers, HttpStatus.OK);

当空列表返回时,我在浏览器中得到以下响应:

[]

如何在浏览器中接收“空”响应而不是 []?有一些方法可以告诉 Spring 将我的列表大小 0 呈现为“null”而不是 []?

【问题讨论】:

为什么不将其初始化为null 如果它应该是一个列表,为什么不返回空列表呢?这不需要您的客户提供特殊情况。 抱歉,混淆了。我想要的是在响应正文中返回一个“null”。如果我这样做: return new ResponseEntity(null, headers, HttpStatus.OK) 浏览器显示一个空白页面,我想显示“null”。 【参考方案1】:

一种基于genericModelList 是否为空的方法可能是:-

if(genericModelList.isEmpty()) 
    return new ResponseEntity<>(null, headers, HttpStatus.OK);
 else 
    return new ResponseEntity<>(genericModelList, headers, HttpStatus.OK);

否则您也可以使用ResponseEntity(MultiValueMap&lt;String,String&gt; headers, HttpStatus status) 构造函数跳过body

【讨论】:

当我跳过正文时,浏览器显示一个空白页面,没有内容正文。我想在正文中显示“null”。我正在使用 JQuerey Ajax 请求来访问这些数据,并且我希望它能够比较结果 == null。如果正文为空白,我会收到一个错误,因为它不是有效的 JSON。 @HélioMárcioFilho 您可以在答案中使用突出显示的代码。跳过正文只是一种替代方法,因为在回答之前我对您的用法了解不多。因此在答案中放置了一个 or else【参考方案2】:

因为您只是将 genericModelList 初始化为 empty 列表,而不是 null。或者您可以在使用不同的正文发送响应之前检查列表的大小。

【讨论】:

我这样做是因为我不能返回一个空列表。我已经尝试返回一个空列表。【参考方案3】:

谢谢大家,下次我会尽量说清楚。我解决了这个问题。

当我的列表大小为 0 时,我试图在 ResponseEntity 的正文中发送“null”,但 Jackson 创建了一个“[]”JSON,而不是我想要的“null”。我没有找到改变这种默认 Jackson 行为的方法,所以我决定放弃 Jackson 并使用 Gson 库。

让我展示一个我的解决方案示例:

@RequestMapping(value = "/test", produces = "application/json", method = RequestMethod.GET)
public ResponseEntity<String> returnEmpty() 

    List<GenericModel> genericModelList = new ArrayList<>();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=utf-8");

    String body = "";

    if (genericModelList.size() == 0) 
        body = "null";
     else 
        body = gson.toJson(genericModelList);
    

    return responseEntity = new ResponseEntity<>(body, headers, HttpStatus.OK);

这样,返回一个字符串并使用 Gson 自己解析为 JSON,而不是使用 Spring/Jackson 的自动解析,我可以控制生成的 JSON。如果我的 List.size() == 0,请看我明确返回一个字符串“null”。

【讨论】:

以上是关于在 ResponseEntity 正文中返回 null (Spring Boot RESTful)的主要内容,如果未能解决你的问题,请参考以下文章

缺少所需的请求正文:public org.springframework.http.ResponseEntity<..model.Customer>

如何在 ResponseEntity 中返回已创建状态 (201 HTTP)

如何在 ResponseEntity 中返回布尔值?

使用ResponseEntity进行返回json数据

Spring Boot:测试包含 Java 时间的 ResponseEntity

春季无法返回带有异常详细信息的 ResponseEntity