如何在responseentity中不返回空值?

rur96b6h  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(341)

我用 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();
    }
  }
}

Map器/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;
  }
}
j8yoct9x

j8yoct9x1#

我认为这个简单的解决方案可以帮助你
https://stackoverflow.com/a/36515285/5108695
因为正在使用jackson,所以必须将其配置为jackson属性。对于spring boot rest服务,您必须在application.properties或application.yml中配置它:

spring.jackson.default-property-inclusion = NON_NULL
qni6mghb

qni6mghb2#

在spring boot视图中https://docs.spring.io/spring-boot/docs/2.4.0/reference/htmlsingle 和搜索 spring.jackson.default-property-inclusion

相关问题