반응형
spring boot로 개발을 하다보면, ObjectMapper(MessageConverter)
를 커스터마이징을 하기 위해 Config를 설정하는 경우가 있다.
@Configuration
public class CommonConfig extends WebMvcConfigurationSupport {
@Override
public void configureMessageConverters(List converters) {
final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
final ObjectMapper objectMapper = new ObjectMapper();
// ObjectMapper Settings(JODA)
// objectMapper.registerModule(new JodaModule());
objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.
WRITE_DATES_AS_TIMESTAMPS, true);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
converter.setObjectMapper(objectMapper);
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
// Add settings to converter, builder
converters.add(converter);
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
}
}
이렇게 설정하면 ObjectMapper가 생성될 때 여러 설정들이 세팅되고, Spring 내부에서 사용하는 MessageConverter에 등록이 된다.
필요한 모듈등(Joda-time ..) 이나 JSON 필드가 없을때 동작 등등을 설정할 수 있다.
근데, 이 WebMvcConfigurationSupport를 상속받아서 사용을 하게 되면 Template(freemarker, velocity ...) 에서 사용하는 리소스 폴더를 못찾는다는 에러가 나온다
즉, 위의 설정만 가지고 index 페이지던 어디던 가보면 다 404 NOT FOUND가 떨어질 것이다.
이유는 즉슨 WebMvcConfigurationSupport
에는 원래 리소스 폴더를 매핑하는 부분이 있는데, 상속해버리면 이 부분이 잘 동작하지 않는듯하다
@Configuration
public class CommonConfig extends WebMvcConfigurationSupport {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
@Override
public void configureMessageConverters(List converters) {
final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
final ObjectMapper objectMapper = new ObjectMapper();
// ObjectMapper Settings(JODA)
// objectMapper.registerModule(new JodaModule());
objectMapper.configure(com.fasterxml.jackson.databind.SerializationFeature.
WRITE_DATES_AS_TIMESTAMPS, true);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
converter.setObjectMapper(objectMapper);
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
// Add settings to converter, builder
converters.add(converter);
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
}
}
그래서 위와 같이 리소스 폴더가 있는 부분을 매핑해주는 설정이 필요하다.
리소스의 위치를 적은 String[] 배열을 만들고 그걸 ResourceHandlerRegistry에 add 시켜주면 된다.
반응형
'Development > Java' 카테고리의 다른 글
[JAVA] 랜덤 퍼센트 계산하는 클래스(?) (0) | 2018.06.08 |
---|---|
[Spring boot] Websocket connect / disconnect 관련 (0) | 2018.06.08 |
[Spring Boot] Spring Security maximumSessions 관련 (0) | 2018.06.08 |
SpringBoot Jackson(ObjectMapper) Config (0) | 2017.07.07 |
[Spring] @Valid Collection Validation 관련 (3) | 2017.06.22 |