我们正在创建一个用于管理资源的 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
,例如-1
或0
。
您似乎像使用补丁请求一样使用PUT请求。要正确使用 PUT 请求,您应该获取电缆信息,更改一些字段并放回原位。在这种情况下,您的 siteId 字段将保持不变。