确定是否在输入 JSON 上故意设置'null'



我们正在创建一个用于管理资源的 REST API。我们正在使用Jersey框架。

以下是JSON的结构

cable {
"id": 1,
"name": "Cable 1",
"description": "Test Cable",
"Site": 4
}

JSON 应映射到以下类。

public class CableDTO {
private Long id;
private String name;
private String description;
//private SiteDTO site;
private Long siteID;
.
.
.
// Getters ans Setters
} 

站点实际上是一个引用对象。输入和输出 JSON 要求CableDTO包含站点 ID而不是整个Site对象。我们有汇编程序,可以将DTO转换为域对象,反之亦然。

示例汇编代码如下所示:

public class CableAssembler {
//some code
public void fillDomain(Cable cable, CableDto dto){
if(dto.getId() != null) cable.setID(dto.getId());
if(dto.getSiteID() != null) cable.setSiteId(dto.getSiteId())
//some more code below
}
}

当调用全新的POST HTTP方法时,此汇编程序运行良好。如果未在输入 json 中设置SiteID,则站点将设置为 null,并且一切都是笨拙的 dory。但是,在PUT HTTP调用中,如果未设置SiteID,则现有SiteID将覆盖写入null。这是因为在 PUT 和 POST 调用中使用相同的汇编程序。汇编程序检查 DTO 中设置的站点 ID 是否null。如果null,则覆盖现有siteID。问题是,我无法区分SiteID中的null值是因为该值未发送还是SiteID确实故意设置为null(这可能是{"siteID":null}

)关于如何解决这个问题的任何指示?
我们使用Jackson进行序列化/反序列化。

如果我理解正确您的情况,我的主张是:

  • 如果可以,请在 JSON 和 DTO 中添加一个boolean字段,告知siteID是否已设置和发送,并在汇编程序或其他代码中检查它;
  • 如果可能的话,为siteId提供另一个默认值,不同于null,例如-10

您似乎像使用补丁请求一样使用PUT请求。要正确使用 PUT 请求,您应该获取电缆信息,更改一些字段并放回原位。在这种情况下,您的 siteId 字段将保持不变。

最新更新