728x90
반응형
SMALL

ObjectMapper는 정말 많이 사용되는데, 이 ObjectMapper를 사용할 때 writeValueAsString(Object value) 같은 경우에 IOException을 던지기 때문에 클라이언트 코드에서 처리하기 여간 귀찮은 게 아니다.

 

그래서 IOException 받아서 내가 만든 커스텀 에러 객체 (예를 들면, MapperToJsonException 이런 클래스? 아니면 그냥 RuntimeException)를 던져서 예외 공통 처리를 하는 방식으로 모듈화하면 개발 생산성이 높아지는 느낌이 든다.

 

물론, 이게 정답은 아니지만 워낙 ObjectMapper는 많이 사용되고 그 중에서도 객체를 Json으로 변환하는 작업은 더더욱 많이 사용되고 그때마다 예외 처리하기가 너무너무 귀찮다. 그래서 난 아예 빈으로 등록할 때 설정 작업을 해주었다.

 

CommonConfiguration

package kr.osci.kapproval.com.config;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class CommonConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        return new CustomObjectMapper();
    }

    public static class CustomObjectMapper extends ObjectMapper {

        @Override
        public String writeValueAsString(Object value) {
            try {
                return super.writeValueAsString(value);
            } catch (IOException e) {
                throw new RuntimeException("value: " + value + " 를 JSON으로 직렬화 중 오류가 발생했습니다. ", e);
            }
        }
    }
}

 

이렇게 빈으로 등록해서 어디선가 ObjectMapper를 주입받아 사용할 일이 있다면 편리하게 사용중이다.

만약, 그 외 설정이 필요한 경우가 있을 수 있는데 그럴때도 난 이렇게 사용하고 설정을 더 추가해준다 아래처럼.

 

CommonConfiguration

package kr.osci.kapproval.com.config;
import com.sun.xml.internal.ws.developer.SerializationFeature;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.PropertyNamingStrategy;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class CommonConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new CustomObjectMapper();

        mapper.configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true);
        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
        
        return mapper;
    }

    public static class CustomObjectMapper extends ObjectMapper {
        
        @Override
        public String writeValueAsString(Object value) {
            try {
                return super.writeValueAsString(value);
            } catch (IOException e) {
                throw new RuntimeException("value: " + value + " 를 JSON으로 직렬화 중 오류가 발생했습니다. ", e);
            }
        }
    }
}

 

여튼 이렇게 잘 사용중이다! 내가 안 까먹기 위해 작성했다. 

728x90
반응형
LIST

+ Recent posts