Обойти требования Джсона Джексона и Ломбока - PullRequest
0 голосов
/ 24 марта 2019

Использование json для сохранения и загрузки данных требует конструктора json для загрузки объекта, и у меня возникают проблемы с получением аннотаций lombok для работы с этим. Что мне делать?

Вот так выглядел мой класс до и после попытки использовать аннотацию для создания моего предмета:

@Data
public class Item { //before

    private int id;

    private int amount;

    public Item(@JsonProperty("id") int id, @JsonProperty("amount") int amount) {
        this.id = id;
        this.amount = amount;
    }

}
@Data
@AllArgsConstructor 
@NoArgsConstructor //I don't want this here as it could cause complications in other places.  But json requires I have this...
public class Item { //after

    private int id;

    private int amount;

}

Я не хочу использовать аннотацию NoArgsConstructor от lombok, так как я не хочу конструктор no args для этого класса. Я понимаю, что могу сделать это:

private Item() {
}

Но надеялся, что есть лучший способ ...

Ответы [ 3 ]

1 голос
/ 24 марта 2019

попробуйте добавить это в ваш конфигурационный файл lombok:

lombok.anyConstructor.addConstructorProperties=true
config.stopBubbling = true
0 голосов
/ 24 марта 2019

Начиная с lombok 1.18.4, вы можете настроить, какие аннотации копируются в параметры конструктора. Вставьте это в ваш lombok.config:

lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty

Затем просто добавьте @JsonProperty к своим полям:

@Data
@AllArgsConstructor 
public class Item {
    @JsonProperty("id")
    private int id;

    @JsonProperty("amount")
    private int amount;
}

Хотя параметры аннотации могут показаться ненужными, они фактически необходимы, поскольку во время выполнения имена параметров конструктора недоступны.

0 голосов
/ 24 марта 2019

Итак, вы говорите, что Джексону нужен конструктор без аргументов для десериализации, и вы не хотите добавлять конструкторы без аргументов в ваши классы, потому что это плохо сочетается с вашей моделью.

Lombok здесь совершенно не имеет значения - не имеет значения, будет ли конструктор без аргументов записан вручную или сгенерирован Lombok, он все равно будет просто конструктором без аргументов.

Ваш реальный вопрос - можетЯ заставляю Джексона работать без конструкторов без аргументов на целевых классах.На это уже есть несколько ответов, вы почти сделали это.Вот что нужно сделать:

  1. Добавить @JsonCreator аннотацию к вашему конструктору
  2. Добавить @JsonProperty("propName") к параметрам конструктора

Вы сделали #2, но не № 1.Добавьте это, и это должно решить вашу проблему.

...