Skip to content

Commit

Permalink
Merge pull request #78 from DepartmentOfHealth-htbhf/fetature/static_…
Browse files Browse the repository at this point in the history
…configure_object_mapper

AFHS-1761 moved object mapper configuration to static
  • Loading branch information
AmarkumarJagtap authored Jan 22, 2020
2 parents 69c44b0 + 4a0c741 commit f130299
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package uk.gov.dhsc.htbhf;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ObjectMapperFactory {

/**
* Configures an object mapper to use ISO local date and time formats and ignores unknown properties in json object.
* @return a configured object mapper
*/
public static ObjectMapper configureObjectMapper() {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));

JsonFactory factory = JsonFactory.builder()
// Change per-factory setting to prevent use of `String.intern()` on symbols
.disable(JsonFactory.Feature.INTERN_FIELD_NAMES)
.build();

return JsonMapper.builder(factory)
.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.build()
.findAndRegisterModules()
.registerModule(javaTimeModule);
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,19 @@
package uk.gov.dhsc.htbhf.requestcontext;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import uk.gov.dhsc.htbhf.requestcontext.aop.RequestContextAdvisor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static uk.gov.dhsc.htbhf.ObjectMapperFactory.configureObjectMapper;

/**
* Configuration class to be used to setup the required beans to setup the request scoped
* request context and the filter to be used to add those values to the MDC for logging.
Expand Down Expand Up @@ -74,25 +63,7 @@ private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
public ObjectMapper objectMapper() {
// This ObjectMapper is not spring-managed, but we want to give it the same settings
// see also: https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-customize-the-jackson-objectmapper
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));

JsonFactory factory = JsonFactory.builder()
// Change per-factory setting to prevent use of `String.intern()` on symbols
.disable(JsonFactory.Feature.INTERN_FIELD_NAMES)
.build();

return JsonMapper.builder(factory)
.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.build()
.findAndRegisterModules()
.registerModule(javaTimeModule);

return configureObjectMapper();
}

@Bean
Expand All @@ -104,4 +75,4 @@ public HeaderInterceptor headerInterceptor() {
public RequestContextAdvisor requestContextAdvisor() {
return new RequestContextAdvisor(requestContextHolder(), mdcWrapper());
}
}
}

0 comments on commit f130299

Please sign in to comment.