在调用@JsonCreator 之后,Jackson 进行了额外的初始化
Posted
技术标签:
【中文标题】在调用@JsonCreator 之后,Jackson 进行了额外的初始化【英文标题】:Jackson makes extra initialization after @JsonCreator was called 【发布时间】:2020-05-27 03:54:25 【问题描述】:我有一个简单的课程A
:
@Getter
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
class A
private final String incomeField;
private final String anotherIncomeField;
private final String fixedValueField;
class B extends A
private B(final String incomeField, final String anotherIncomeField)
super(incomeField, anotherIncomeField, "someFixedValue");
@JsonCreator
public static B of(@JsonProperty("incomeField") final String incomeField, @JsonProperty("anotherIncomeField") final String anotherIncomeField)
return new B(incomeField, anotherIncomeField);
当我通过jmsTemplate.convertAndSend(destination, new B("foo", "bar"))
向 ActiveMQ 推送消息时,队列中的实际消息如下:
"incomeField": "foo",
"anotherIncomeField": "bar",
"fixedValueField": null
我使用@JmsListener(destination = "my-destination)
处理JMS 消息并接收fixedValueField
设置为null
的B
类型的对象,而我希望它是someFixedValue
,因为我在private
构造函数中设置它。
当我调试所有这些东西时,我看到 @JsonCreator
被正确调用并且我的对象具有所有字段的预期值,但是当 Jackson 完成反序列化时,我看到 fixedValueField
是 null
。
为什么会发生这种情况?
注意所有字段都是final
环境:
Java 11 Spring Boot 2.1.3.RELEASE 杰克逊 2.9.8 ActiveMQ 5.15.8【问题讨论】:
【参考方案1】:这就是为什么以这种方式工作的答案 - ***.com/a/30341178/4760059
这可能是一个修复 - ***.com/a/42142268/4760059
【讨论】:
以上是关于在调用@JsonCreator 之后,Jackson 进行了额外的初始化的主要内容,如果未能解决你的问题,请参考以下文章
在顶级地图上使用@JacksonInject和@JsonCreator
为啥构造函数用@JsonCreator注解时,它的参数必须用@JsonProperty注解?
Jackson 还需要 getter 方法来使用 @JsonCreator 正确序列化 bean 属性
将 JsonCreator 与 JsonProperty.Access.READ_ONLY 一起使用时出现 InvalidDefinitionException