【问题标题】:Spring hateoas jaxrslinkbuilder adds null fieldsSpring hatoas jaxrslinkbuilder 添加空字段
【发布时间】:2019-10-22 18:30:03
【问题描述】:

我正在尝试将 HATEOAS 链接添加到我的 Controller 结果中。 链接创建:

       Link link = JaxRsLinkBuilder.linkTo(MainRestService.class)
                    .slash(this::getVersion)
                    .slash(LinkMappingConstants.TAXPAYERS)
                    .slash(taxPayerId)
                    .slash(LinkMappingConstants.ESTIMATIONS)
                    .slash(estimationId)
                    .withSelfRel();

链接本身创建良好,但生成的 JSON 中有多余的条目:

"links": [
        {
          "rel": "self",
          "href": "http://localhost:8080/blablabla",
          "hreflang": null,
          "media": null,
          "title": null,
          "type": null,
          "deprecation": null,
          "template": {
            "variables": [

            ],
            "variableNames": [

            ]
          }
        }
      ]

我怎样才能得到这种格式? (不使用属性spring.jackson.default-property-inclusion=NON_NULL

"links": [
        {
          "rel": "self",
          "href": "http://localhost:8080/blablabla"
        }
      ]

谢谢。

【问题讨论】:

    标签: java spring rest spring-boot jax-rs


    【解决方案1】:

    正如您所提到的,如果您希望在整个 JSON 中包含 NON_NULL 属性,而不仅仅是 links,您可以使用 spring.jackson.default-property-inclusion=NON_NULL。但是,这不会修复空模板字段。

    如果您希望使用 Jackson 进行序列化,仅在 Link 对象上包含 NON_NULL 属性,您可以通过使用带有 @JsonInclude(Include.NON_NULL) 注释的 Link 对象的 Jackson MixIn 来实现此目的。

    举个例子:

    @JsonInclude(Include.NON_NULL)
    abstract class LinkMixIn {
    }
    
    mapper.addMixIn(Link.class, LinkMixIn.class);
    

    要隐藏模板字段,如果您不希望模板部分被序列化,您可以添加 @JsonIgnore,或者尝试在上述答案中包含 NON_DEFAULT 属性,它会创建对象的新实例并将其与进行序列化以确定是否应包含它。

    例如像下面这样的东西根本不会序列化 getTemplate 的结果

    @JsonInclude(Include.NON_NULL)
    abstract class LinkMixIn {
        @JsonIgnore abstract Template getTemplate();
    }
    

    【讨论】:

    • 任何具有此属性字段的“模板”都将保留。
    • @kros365 确实如此 - 为此需要额外的 MixIn 自定义(NON_DEFAULT 或忽略),我将更新我的答案以反映它。
    • 我使用 org.springframework.hateoas.ResourceSupport 和 JaxRsLinkBuilder 创建链接。创建自定义链接不是问题,只是我认为有一种方法可以配置此解决方案。
    • @kros365 上面的答案应该涵盖将序列化自定义为您所要求的,或者通过使用JsonIgnore 完全忽略属性,或者仅在它们为空时隐藏它们。如果有不清楚的地方请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多