Как я понял, Spring уже предоставляет bean-компонент для Jackson ObjectMapper
. Поэтому вместо создания нового bean-компонента я пытаюсь настроить этот bean-компонент.
Из этого сообщения в блоге и затем этот проект Github Я использовал Jackson2ObjectMapperBuilder
bean для достижения этой настройки.
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
Затем я пытался настроить десериализатор, чтобы сделать его более мягким: если при десериализации свойства возникает исключение, я хочу, чтобы свойство объекта результата было null
, и чтобы десериализация продолжалась (по умолчанию происходит сбой для первого свойства, которое не может быть десериализованным).
Мне удалось добиться этого с помощью класса NullableFieldsDeserializationProblemHandler
, который расширяет DeserializationProblemHandler
(я не думаю, что код актуален, но при необходимости я могу поделиться им).
Самый простой способ зарегистрировать этот обработчик - использовать .addHandler()
метод ObjectMapper
. Но, конечно, мне нужно будет устанавливать это каждый раз, когда я ввожу и использую ObjectMapper
. Я хотел бы иметь возможность настроить обработчик так, чтобы каждый раз, когда ObjectMapper
подключается автоматически, обработчик уже присутствовал.
Лучшее решение, которое я придумал до сих пор, - использовать аннотацию @PostConstruct
только для регистрации обработчика проблемы.
@Configuration
public class JacksonConfiguration implements InitializingBean {
@Autowired private ObjectMapper objectMapper;
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(ApplicationContext context) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.findModulesViaServiceLoader(true);
return builder;
}
@Override
public void afterPropertiesSet() {
objectMapper.addHandler(new NullableFieldsDeserializationProblemHandler());
}
}
Но проблема этого решения в том, что, похоже, я все еще могу получить доступ к ObjectMapper
с автоматическим подключением, который еще не зарегистрировал обработчик проблемы (я вижу, что это происходит после того, как он мне понадобится в режиме отладки).
Есть идеи, как мне зарегистрировать этот обработчик? Я заметил, что у Jackson2ObjectMapperBuilder
есть .handlerInstantiator()
, но я не мог понять, как его использовать.
Примечание. Я также пробовал использовать Jackson2ObjectMapperBuilderCustomizer, поскольку я использую Spring Boot, но не получил лучших результатов.