- 출처 : http://stackoverflow.com/questions/12934045/null-values-as-empty-strings-when-using-responsebody-annotation -
1. null serializer 를 작성한다.
import java.io.IOException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.map.JsonSerializer; import org.codehaus.jackson.map.SerializerProvider; public class NullSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeString(""); } }
2. custom object mapper 를 작성한다. (위에서 작성한 NullSerializer 사용)
import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ser.StdSerializerProvider; public class CustomObjectMapper extends ObjectMapper{ public CustomObjectMapper(){ StdSerializerProvider sp = new StdSerializerProvider(); sp.setNullValueSerializer(new NullSerializer()); this.setSerializerProvider(sp); } }
3. 스프링 설정파일을 통해서, 위에서 작성한 ObjectMapper를 명시적으로 inject 한다.
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="objectMapper"> <bean class="CustomObjectMapper"/> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
* 참고
위의 예제는 Controller 메서드에서 @ResponseBody 를 사용하여 json을 내보내는 것을 가정하여 작성한 예제인 듯 싶다.
내 경우는 @ResponseBody를 사용하지 않고, Controller 메서드에서 json view의 이름을 리턴하고 (ex: return "json")
ContentNegotiatingViewResolver 등의 ViewResolver를 사용해서 MappingJacksonJsonView 에 접근하여 json
을 생성하는 케이스였는데, 이 경우에는 MappingJacksonHttpMessageConverter의 property로 CustomObjectMapper를 inject 해 주는 것이 아니라, MappingJacksonJsonView 의 property 로 CustomObjectMapper 를 명시적으로 inject 해 주면 된다.
또한 이 예제는 jackson json parser의 버전 2.0 미만을 기준으로 작성한 것으로, jackson의 버전이 2.0 이상일 경우에는 패키지 및 클래스명 등이 달라지므로, 거기에 맞춰서 구현하도록 하자.