При проектировании неизменяемых классов Джексон должен вызывать конструктор со всеми необходимыми аргументами.
Если вы не использовали ломбок,
- Аннотируйте конструктор, который вы хотите, чтобы Джексон вызывал, с помощью
@JsonCreator
.
- Аннотируйте параметры конструктора с помощью
@JsonProperty
. Если вы хотите пропустить это, вы можете добавить расширение ParameterNamesModule
.
Пример:
static class Test {
private final String a;
public Test() {
a = "default";
}
@JsonCreator // Jackson will use this constructor during deserialization
public Test(@JsonProperty("a") String a) { // @JsonProperty can be skipped if you use ParameterNamesModule annotation
this.a = a;
}
// Getter for A
}
Аннотация Lombok @Value
создает только один конструктор all-args, который мы должны аннотировать с помощью @JsonCreator
. Это можно сделать, пометив класс с помощью @AllArgsConstructor(onConstructor = @__(@JsonCreator))
.
Поскольку конструктор генерируется автоматически, мы не сможем аннотировать параметры с помощью @JsonProperty
, поэтому вам придется использовать ParameterNamesModule
.
Фрагмент кода со следующими изменениями:
public class TestApplication {
@Value
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
static final class Test {
private final String a;
}
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new ParameterNamesModule());
String res = objectMapper.writeValueAsString(new Test("test"));
System.out.println(res);
System.out.println(objectMapper.readValue(res, Test.class));
}
}
Ниже приведена зависимость maven для модуля имен параметров.
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.9.8</version>
<scope>compile</scope>
</dependency>