Spring 3.1 이 java 객체를 json으로 변환해 줄 때, 값이 없는 객체는 json에 빈문자("") 대신 "null" 문자열을 리턴해 주는데, 이를 빈문자("")로 리턴해 주도록 바꾸는 방법

By | 8월 5, 2014

- 출처 :  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 이상일 경우에는 패키지 및 클래스명 등이 달라지므로, 거기에 맞춰서 구현하도록 하자.
 
 
 
 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments