Java 确定是否';空';是故意在输入JSON上设置的
我们正在创建一个RESTAPI来管理资源。我们正在使用Java 确定是否';空';是故意在输入JSON上设置的,java,json,rest,api,jersey,Java,Json,Rest,Api,Jersey,我们正在创建一个RESTAPI来管理资源。我们正在使用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; //pr
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,而不是整个站点
对象。我们有汇编程序,它们将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,并且全部为hunky-dory。但是,在PUT HTTP调用中,如果未设置SiteID
,则现有的SiteID
将被过度写入null
。这是因为在PUT和POST调用中使用相同的汇编程序。汇编程序检查DTO中设置的siteID是否为null
。如果为null
,则覆盖现有的siteID
。问题是,我无法区分SiteID
中的null
值是因为没有发送该值还是SiteID
确实被故意设置为null
(这是可能的{“SiteID”:null}
)
有关于如何解决这个问题的建议吗我们使用
Jackson
进行序列化/反序列化。似乎您使用的PUT请求与补丁请求类似。要正确使用PUT请求,您应该获取电缆信息,更改一些字段并放回。在这种情况下,您的siteId字段将保持不变。似乎您使用的PUT请求与补丁请求类似。要正确使用PUT请求,您应该获取电缆信息,更改一些字段并放回。在这种情况下,您的siteId字段将保持不变。如果我正确理解您的情况,我的建议如下:
- 如果可以,在JSON和DTO中添加一个
字段,告知是否设置并发送了boolean
,并在汇编程序或其他代码中进行检查李>siteID
- 如果可能,为
提供另一个不同于siteId
的默认值,如null
或-1
0
- 如果可以,在JSON和DTO中添加一个
字段,告知是否设置并发送了boolean
,并在汇编程序或其他代码中进行检查李>siteID
- 如果可能,为
提供另一个不同于siteId
的默认值,如null
或-1
0
- 如果我正确理解您的情况,我的建议是: