java - 如何在 ResponseEntity 中不返回空值?
问题描述
我ResponseEntity
用来返回对 GET "api/v1/name" 和 POST "api/v1/name" 请求的响应。
我的目标不是返回空值响应,例如在 POST "api/v1/name" 请求中,当前响应正文为:
{
"id": null,
"name": "who",
"newid": "A8C90A53-78F6-4BD6-9628-CBA8FC349C08"
}
我希望它看起来像什么:
{
"name": "who",
"newid": "A8C90A53-78F6-4BD6-9628-CBA8FC349C08"
}
在我看来,使用下面的代码重新创建对象只会降低代码的可读性,并且可能会使用更多的内存(我不确定,如果我错了,请告诉我):
...
Map<String, String> responseBody = new HashMap<>();
responseBody.put("name", nameModel.getName());
responseBody.put("newid", nameModel.getNewId());
return new ResponseEntity<>(responseBody, HttpStatus.OK);
==== 下面是完整的存储库,如果您希望查看更新的存储库:https ://github.com/kidfrom/g2_java/tree/main/etc/mssqlserver
控制器/NameController.java
package com.example.mssqlserver.controller;
import com.example.mssqlserver.mapper.NameMapper;
import com.example.mssqlserver.model.NameModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
public class NameController {
@Autowired
private NameMapper nameMapper;
@GetMapping("api/v1/name")
public ResponseEntity<?> selectAll() {
return new ResponseEntity<>(nameMapper.selectAll(), HttpStatus.OK);
}
@PostMapping("api/v1/name")
public ResponseEntity<?> insert(@RequestBody NameModel nameModel) {
// validator
if (!nameModel.requestIsValid()) {
return ResponseEntity.badRequest().build();
}
if (nameMapper.insert(nameModel) == 1) {
return new ResponseEntity<>(nameModel, HttpStatus.OK);
} else {
return ResponseEntity.badRequest().build();
}
}
}
映射器/NameMapper.java
package com.example.mssqlserver.mapper;
import com.example.mssqlserver.model.NameModel;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface NameMapper {
@Select("SELECT * FROM name")
public List<NameModel> selectAll();
@SelectKey(statement = "SELECT NEWID()", keyProperty = "newid", resultType = String.class, before = true)
@Insert("INSERT INTO name (name, newid) VALUES (#{name}, #{newid})")
// @Options(useGeneratedKeys = true, keyProperty = "id")
int insert(NameModel nameModel);
}
模型/NameModel.java
package com.example.mssqlserver.model;
public class NameModel {
private Integer id;
private String name;
private String newid;
public NameModel(Integer id, String name, String newid) {
this.id = id;
this.name = name;
this.newid = newid;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public String getNewid() {
return newid;
}
public void setNewid(String newid) {
this.newid = newid;
}
public boolean requestIsValid() {
if (this.name.isEmpty()) return false;
return true;
}
}
解决方案
我认为这个简单的解决方案可以帮助你
https://stackoverflow.com/a/36515285/5108695
由于正在使用 Jackson,因此您必须将其配置为 Jackson 属性。对于 Spring Boot REST 服务,您必须在 application.properties 或 application.yml 中进行配置:
spring.jackson.default-property-inclusion = NON_NULL
推荐阅读
- c - 程序在三个输入的数字中找到最大和最小的,并显示识别的最大/最小数字是偶数还是奇数
- flutter - 如果没有 Scaffold,Material App 样式将无法工作
- android - 带有类型参数的 Kotlin Poet 超级接口
- google-chrome-extension - Chrome 扩展连接-src
- c++ - UART 没有接收到 Qt 中所有发送的值
- vbscript - VBScript中使用Split的下标超出范围
- node.js - npm 错误:ENOENT,chmod。这是怎么回事?
- shell - 设置包含多个空格序列的环境变量
- javascript - 如何在反应单选和多选中制作选择框?
- r - 如何在太多循环中加速应用函数