Как заставить Джексона игнорировать свойства конструктора - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь заставить Джексона десериализовать

{
    "test": 2018
}

до

SomeJavaClass:
 private final Test test

Но я хочу сделать свой тестовый класс с использованием Project Lombok.Однако Lombok аннотирует класс с помощью ConstructorProperties, и по какой-то причине это делает Джексона неудачным.

Мои классы выглядят так:

@Value
public class SomeJavaClass {
    Test test;
}


@Value
public class Test{
    String value;
}

Тест деломбоксируется как:

public class Test {
    int value;

    @java.beans.ConstructorProperties({"value"})
    public Test(final int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Test)) {
            return false;
        }
        final Test other = (Test) o;
        if (this.getValue() != other.getValue()) {
            return false;
        }
        return true;
    }

    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        result = result * PRIME + this.getValue();
        return result;
    }

    public String toString() {
        return "Test(value=" + this.getValue() + ")";
    }
}

Можно ли заставить Джексона как-то игнорировать свойства конструктора?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я тоже думаю, что проблема здесь не в аннотации @java.beans.ConstructorProperties({"value"}).

Судя по вашему деломбоку, у вас есть набор аннотаций, которые не позволяют конструктору по умолчанию формироваться.

Поэтому, возможно, вы избавитесь от этой проблемы, добавив @NoArgsConstructor. Без конструктора по умолчанию и без @JsonCreator s вы получите ошибку вроде:

com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно создать экземпляр org.example.spring.jackson.JacksonTest $ TestClass (хотя существует хотя бы один Создатель): не может десериализоваться из Объекта значение (без создателя на основе делегатов или свойств)

0 голосов
/ 12 ноября 2018

Причина, по которой это не удается - не @ConstructorProperties.Фактически, эта аннотация требуется , чтобы Джексон работал с @AllArgsConstructor.

Ломбока. Проблема здесь в том, что значение test в вашем JSON является целым числом, но ваш классструктура требует, чтобы это был объект.Таким образом, вы должны сделать поле test в SomeJavaClass и int.Тогда вам также не нужен класс Test.(Или переименуйте value в test в Test, избавьтесь от SomeJavaClass и десериализуйте до Test.)

...