Я ищу документацию о том, как Джексон работает с частными конструкторами неизменяемых типов. Использование Jackson 2.9.6 и средства сопоставления объектов по умолчанию, предоставленного весенней загрузкой, два работают с jdk-10.0.1
Учитывая JSON:
{"a":"test"}
и задан класс вроде:
public class ExampleValue {
private final String a;
private ExampleValue() {
this.a = null;
}
public String getA() {
return this.a;
}
}
Десериализация (на удивление, по крайней мере для меня) работает.
В то время как это не так:
public class ExampleValue {
private final String a;
private ExampleValue(final String a) {
this.a = a;
}
public String getA() {
return this.a;
}
}
И это делает:
public class ExampleValue {
private final String a;
@java.beans.ConstructorProperties({"a"})
private ExampleValue(final String a) {
this.a = a;
}
public String getA() {
return this.a;
}
}
Я предполагаю, что единственный способ, которым может работать первый пример, — это использовать отражение для установки значения конечного поля (что, я полагаю, он делает с помощью java.lang.reflect.AccessibleObject.setAccessible(true)
.
Вопрос 1: прав ли я, что в данном случае Джексон работает именно так? Я предполагаю, что это может привести к сбою под управлением менеджера безопасности, который не разрешает эту операцию?
Поэтому моим личным предпочтением был бы последний пример кода выше, так как он требует меньше «магии» и работает под управлением менеджера безопасности. Тем не менее, я был немного сбит с толку различными темами, которые я нашел о Lombok и генерации конструктора, которые раньше генерировали по умолчанию @java.beans.ConstructorProperties(...)
, но затем изменили значение по умолчанию, чтобы больше не делать этого, и теперь позволяют настроить его по желанию, используя lombok.anyConstructor.addConstructorProperties=true
Некоторые люди (в том числе в ломбокских примечаниях к выпуску для v1.16.20
) предлагают следующее:
Oracle более или менее нарушила эту аннотацию с выпуском JDK9, что потребовало этого критического изменения.
но я не совсем понимаю, что под этим подразумевается, что сломал Oracle? Для меня, использующего JDK 10 с jackson 2.9.6, все работает нормально.
Вопрос 2: Кто-нибудь может пролить свет на то, как эта аннотация была нарушена в JDK 9 и почему ломбок теперь считает нежелательным генерировать эту аннотацию по умолчанию.