Java 确定是否';空';是故意在输入JSON上设置的

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

我们正在创建一个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;

  //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

      PUT/PATCH/POST,都通过同一个汇编程序。关键是,如果有人想解除站点与电缆的关联,他可以发送一个{“siteID”:null}。现在如何确定siteID是否已发送。例如,输入的json现在是{“description”:“changeddesc”},然后在这两种情况下,我得到的siteID都是null。在后一种情况下,不应解除siteID与电缆的关联。这就是为什么如果只想更改实体的一部分,则首选PATCH方法。修补程序中的{“description”:“changed desc”}将不会覆盖siteId。在PUT的情况下,您应该指定现有的siteId值(以及其他值)以避免丢失它们:{“description”:“changed desc”,“siteId”:“currentSiteId”,…}。PUT/PATCH/POST都通过相同的汇编程序。关键是,如果有人想解除站点与电缆的关联,他可以发送一个{“siteID”:null}。现在如何确定siteID是否已发送。例如,输入的json现在是{“description”:“changeddesc”},然后在这两种情况下,我得到的siteID都是null。在后一种情况下,不应解除siteID与电缆的关联。这就是为什么如果只想更改实体的一部分,则首选PATCH方法。修补程序中的{“description”:“changed desc”}将不会覆盖siteId。在PUT的情况下,您应该指定现有的siteId值(以及其他值)以避免丢失它们:{“description”:“changed desc”,“siteId”:“currentSiteId”,…}.Thnx@vertiris。有时在图书馆的复杂世界里,我们会忘记一些简单的事情。我认为JSON库注释会在某种程度上起到帮助和自动控制的作用。但是设置布尔值的想法是一个简单而优雅的解决方案。thnx,thnx@vertiris。有时在图书馆的复杂世界里,我们会忘记一些简单的事情。我认为JSON库注释会在某种程度上起到帮助和自动控制的作用。但是设置布尔值的想法是一个简单而优雅的解决方案。thnx。