MappingJackson2HttpMessageConverter создается несколько раз во время запуска Spring 4, переопределяя (обнуляя) пользовательские настройки ObjectMapper - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь настроить мой ObjectMapper на использование определенной временной зоны вместо использования GMT по умолчанию. Я следовал инструкциям из разных мест (см. Ссылки ниже), пытаясь настроить через код и XML. После отладки я замечаю, что код устанавливает параметр TimeZone ObjectMapper один раз, однако во время запуска класс Jackson2ObjectMapperBuilder вызывается несколько раз и переопределяет (обнуляет) мой параметр TimeZone и возвращается по умолчанию к GMT по завершении процесса запуска, оба в Tomcat и в моем модульном тесте.

Код:

Config:

@Configuration
@EnableWebMvc
public class JacksonMapperConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
    }

    @Bean    
    public MappingJackson2HttpMessageConverter converter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(jacksonObjectMapper());
        return converter;
    }

    @Bean
    public ObjectMapper jacksonObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setTimeZone(TimeZone.getTimeZone("America/New_York"));
        return objectMapper;
    }

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.timeZone("America/New_York");
        return builder;
    }
}

Организация:

@Entity
public class AllocationEstimate extends AbstractEntity<Integer> {

    private static final long serialVersionUID = 1L;

    @NotNull(message = "validation.mandatoryField")
    @Column(nullable = false)
    @Temporal(TemporalType.DATE)
    @JsonFormat(pattern = "MM/dd/yyyy")
    private Date endDate;

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }
}

Контроллер:

@RestController
@RequestMapping("/allocation-estimate")
public class AllocationEstimateRestController extends AbstractGenericCrudRestController<AllocationEstimate, Integer> {

    private final AllocationEstimateService allocationEstimateService;

    @Autowired
    public AllocationEstimateRestController(AllocationEstimateService allocationEstimateService) {
        this.AllocationEstimateService = allocationEstimateService;
    }

    @Override
    @Post
    public AllocationEstimate createOrUpdate(@RequestBody @Valid AllocationEstimate resource) {
        return super.createOrUpdate(resource);
    }
}

Я использовал все вышеперечисленное и комбинацию различных настроек. Некоторые только с configureMessageConverters или только пытаются установить @Bean.

У меня вопрос: видел ли кто-нибудь такое поведение и как я могу это исправить? Я пробовал комбинацию разных вещей, но мои настройки всегда переопределяются к концу процесса загрузки. Я использую Spring 4.3.16.

Для справки:

Настройка ObjectMapper весной

https://dzone.com/articles/latest-jackson-integration

https://www.javacodegeeks.com/2014/09/customizing-httpmessageconverters-with-spring-boot-and-spring-mvc.html

Как заставить Jackson2ObjectMapperBuilder при загрузке пружины?

SpringMVC Настройка Jackson2HttpMessageConverter не работает

EDIT Я подозреваю, что AllEncompassingFormHttpMessageConverter является виновником, я не уверен, что это такое, но что-то несколько раз создает экземпляр этого класса, который, в свою очередь, создает экземпляр MappingJackson2HttpMessageConverter несколько раз и, таким образом, переопределяет мой конвертер, который есть в моей конфигурации.

1 Ответ

0 голосов
/ 15 мая 2018

Добавьте @Primary к вашим jacksonObjectMapper() и jacksonBuilder() бобам.

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

...