У меня есть простой класс 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);
}
}
Когда я отправляю sh сообщение ActiveMQ через jmsTemplate.convertAndSend(destination, new B("foo", "bar"))
, фактическое сообщение в очереди следующее:
{
"incomeField": "foo",
"anotherIncomeField": "bar",
"fixedValueField": null
}
Я обрабатываю сообщения JMS с помощью @JmsListener(destination = "my-destination)
и получаю объект типа B
с fixedValueField
, установленным на null
, в то время как я ожидаю, что он будет someFixedValue
, как я его установил в конструкторе private
.
Когда я отлаживаю все эти вещи, я вижу, что @JsonCreator
вызывается правильно, и мой объект имеет ожидаемые значения для всех полей, но когда Джексон заканчивает десериализацию, я вижу, что fixedValueField
равен null
. Почему это может произойти?
Обратите внимание, что все поля: final
Среда:
- Java 11
- Spring Boot 2.1 .3.RELEASE
- Джексон 2.9.8
- ActiveMQ 5.15.8