gpt4 book ai didi

java - Jackson:允许属性命名策略与@JsonCreator 一起使用

转载 作者:搜寻专家 更新时间:2023-11-01 03:20:49 25 4
gpt4 key购买 nike

我正在使用 Jackson 序列化/反序列化不可变的 POJO。因为 POJO 是不可变的,所以我这样定义它们:

class Foo {
private final String bar;
private final String wibbleBoing;

@JsonCreator
public Foo(@JsonProperty("bar") String bar, @JsonProperty("wibbleBoing") wibbleBoing) {
this.bar = bar;
this.wibbleBoing = wibbleBoing;
}

... [getters] ...
}

我被迫在构造函数参数上使用 @JsonProperty,因为 Java 字节码不包含参数名称。 [实际上,我知道它可以用于 Java 8,而且我可以使用 jackson-module-parameter-names 来规避它,但这不是我现在的选择]。

现在,假设我还想使用属性命名策略,这样我就可以将所有属性名称更改为带下划线的小写字母而不是驼峰式,而且我没有更改我现有的 POJO。

在 Jackson 2.3 中,这是一种享受。然而,在 Jackson 2.4 中,@JsonProperty 的显式命名 - 带注释的构造函数参数似乎胜过了命名策略。

重命名我的 POJO 中的所有 @JsonProperty 注释是一个有漏洞的抽象,我宁愿不这样做......所以还有另一种方法可以设置我的映射器或在全局范围内做一些事情将属性命名策略应用于此类构造函数参数?

最佳答案

您可能想尝试更高版本:至少 2.5(.4),或 2.6.0-rc2(官方 2.6.0 应该很快就会发布,但在那之前)。这方面存在已知错误,由隐式名称(getter/setter、字段、构造函数参数名称)和显式覆盖(如 @JsonProperty)之间的划分引起。 2.6.0 修复了这些;我不是 100% 确定是否所有都在 2.5 中向后移植。

如果您必须使用早期版本,您可以通过子类化 JacksonAnnotationIntrospector 并覆盖 findNameForSerialization()findNameForDeserialization() 来解决问题findImplicitPropertyName()(或类似的东西,请参阅 javadocs),并在那里添加转换。这将是一种解决方法,但允许您在版本按预期工作之前让一切正常工作。

关于java - Jackson:允许属性命名策略与@JsonCreator 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31004164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com