Development/Java

[Spring Boot] Resource load 관련

반응형

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 시켜주면 된다.

반응형