Джексон: десериализовать с помощью Builder вместе со стандартными сеттерами / геттерами? - PullRequest
0 голосов
/ 21 ноября 2018

Возможно ли с помощью Джексона десериализовать json с помощью шаблона Builder, а также с использованием метода установки и получения по умолчанию?

Мой объект создан с помощью Builder, который охватывает только обязательные (окончательные) поля, но у меня нетконечные поля с некоторыми значениями, которые также должны быть десериализованы с помощью сеттеров.

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

new ObjectMapper().readValue(json, Foo.class);

json - представление jsonсериализуется с сериализатором Джексона по умолчанию, например:

objectMapper.writeValueAsString(foo);

class

@Getter
@Setter
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonDeserialize(builder = Foo.Builder.class)
public class Foo {
    private final String key;
    private final Long user;
    private final String action;
    private final String material;
    private final String currency;

    private Foo(String key, Long user, String action, String material, String currency) {
        this.key = key;
        this.user = user;
        this.action = action;
        this.material = material;
        this.currency = currency;
    }

    public static class Builder {
        private  String key;
        private Long user;
        private String action;
        private String material;
        private String currency;

        @JsonProperty("key")
        public Foo.Builder withKey(String key) {
            this.key = key;
            return this;
        }

        @JsonProperty("user")
        public Foo.Builder withUser(Long user) {
            this.user = user;
            return this;
        }

        @JsonProperty("action")
        public Foo.Builder withAction(String action) {
            this.action = action;
            return this;
        }

        /// other 'with' setters....
    }

    @JsonProperty("state")
    private int state;

    @JsonProperty("stat")
    private String stat;

    @JsonProperty("step")
    private String step;
}

Исключение, которое он выдает, например:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: нераспознанное поле «состояние» (класс com.Foo $ Builder), не помеченное как игнорируемое (5 известных свойств: «ключ», «пользователь», «действие», «материал», «валюта»,])

Если это невозможно, какой обходной путь самый дешевый?

1 Ответ

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

Две подозрительные вещи:

  • Вы готовы использовать конструктор внутри класса Foo.В этом случае вам следует исправить спецификацию (SessionData.Builder.class в этом случае неверен).
  • Вы действительно пытаетесь использовать внешний компоновщик.В этом случае вы должны удалить или, по крайней мере, пометить как игнорируемый внутренний конструктор, это, по-видимому, и является причиной получаемого вами исключения.

В обоих случаях вы должны убедиться, что последний метод полученэкземпляр Foo называется build(), в противном случае вам следует пометить сборщик с помощью @JsonPOJOBuilder(buildMethodName = "nameOfMethod", withPrefix = "set").

...