Как работает десериализатор Джексона по умолчанию - PullRequest
3 голосов
/ 25 октября 2019

Я использую Spring-boot 2.1.6, и у меня есть DTO:

@AllArgsConstructor
@Builder
@Data // setters, getters, others
@NoArgsConstructor
public class ExampleDto {
    private String fieldOne;
    private String fieldsTwo;

}

Мне действительно нужно столько аннотаций Lombok здесь? Что Jackson будет использовать по умолчанию при десериализации соединения HTTP (микросервисы)? Я думаю, только NoArgsConstructor + setters будет в порядке? Или он использует reflection, и только при условии, что без аргумента-конструктора это нормально?

Есть ли возможность изменить поведение Jackson, чтобы использовать только AllArgsConstructor или builder? В журналах я видел, что мое приложение использует Jackson для десериализации материала.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.8</version>
    <scope>provided</scope>
</dependency>

 <dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

Редактировать:

Мой вопрос отличается от Не могу заставить Джексона и Ломбок работать вместе потому что это работает.

Ответы [ 4 ]

1 голос
/ 25 октября 2019

Джексон использует конструктор по умолчанию (без аргументов) для создания объекта, а затем устанавливает значение с помощью установщиков. поэтому вам нужны только @NoArgsConstructor и @ Setter.

0 голосов
/ 25 октября 2019

Десериализация Джексона по умолчанию использует конструктор без аргументов и сеттеры объекта. Так что с Lombok вам понадобится минимум:

@NoArgsConstructor
@Setter
public class ExampleDto {
    private String fieldOne;
    private String fieldsTwo;
}

(обратите внимание, что если вы когда-нибудь сериализуете, вам понадобится как минимум @Getter).

Существуетвозможность переопределить десериализацию Джексона по умолчанию для использования компоновщика Lombok. Это описано в верхнем ответе на Невозможно заставить Джексона и Ломбока работать вместе (как уже упоминали другие). Т.е.

@Builder
@Data
@JsonDeserialize(builder = ExampleDto.ExampleDtoBuilder.class)
public class ExampleDto {
    private String fieldOne;
    private String fieldsTwo;
}

@JsonPOJOBuilder(withPrefix = "") 
public static class ExampleDtoBuilder {

}
0 голосов
/ 25 октября 2019

Хорошо, поскольку вы используете Spring Boot, где-то должен быть класс конфигурации Jackson, помеченный @Configuration. Примерно так должно включить сериализацию для вашего Java-компонента без необходимости каких-либо аннотаций

@Configuration
public class JacksonConfiguration {

   @Bean
   public ObjectMapper objectMapper() {
      ObjectMapper mapper = new ObjectMapper();
      objectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
      return mapper;
   }

}
0 голосов
/ 25 октября 2019

Согласно в этом уроке Джексон ищет методы получения и установки. Также для создания объекта типа необходим конструктор по умолчанию. Таким образом, в основном вам нужен класс, который удовлетворяет java bean соглашениям.

Короче говоря: вам нужно @Data для методов получения и установки и @NoArgsConstructor для конструктора по умолчанию дляудовлетворить бобовое соглашение. @AllArgsConstructor и @Builder не должны быть необходимы для Джексона.

...