杰克逊去掉前导下划线

Jackson strips leading underscore

我们的 swagger 规范定义了一个 属性 _links.

places-result:
  type: object
  properties:
    _links:
      $ref: "#/components/schemas/links-underscore-type"

使用 swagger-codegen,我们看到这个名字最终出现在输出 class:

@JsonProperty("_links")
private LinksUnderscoreType _links = null;

@Schema(
    description = ""
)
@Valid
public LinksUnderscoreType getLinks() {
    return this._links;
}

但是,Jackson 添加了一个 属性,带和不带前导下划线:

{
  "result": {
    "links": {
        "self": "http://localhost:8083/places?page=181",
        "previous": "http://localhost:8083/places?page=180",
        "first": "http://localhost:8083/places?page=0"
    },
    "_links": {
        "self": "http://localhost:8083/places?page=181",
        "previous": "http://localhost:8083/places?page=180",
        "first": "http://localhost:8083/places?page=0"
    }
}

因为它是一个 Spring 引导应用程序,我们应该能够使用这个 属性:

来影响命名策略
spring.jackson.property-naming-strategy: LOWER_CASE

None 的接受值似乎保留了指定的 属性 名称。

我们如何保留前导下划线?

原来非下划线的属性进来了,是因为被getter方法匹配到了。解决方法是不匹配getter方法。这可以在 Spring 引导配置中实现:

spring:
  jackson:
    mapper:
      AUTO_DETECT_GETTERS: false

或者在代码中:

objectMapper.configure(MapperFeature.AUTO_DETECT_GETTERS, false);