본문 바로가기
Programming/>> Spring

[Spring] JsonView 리턴

by 니키ᕕ( ᐛ )ᕗ 2016. 9. 28.

Spring에서 json 응답을 흔히 쓰는 방법은 jackson 라이브러리를 쓰는 방법인데,

 

pom.xml

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.8.3</version>
</dependency>

servlet-context.xml

<beans:bean id="beanNameResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
	<beans:property name="order" value="0"/>
</beans:bean>
<beans:bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
	<beans:property name="contentType" value="application/json;charset=UTF-8"></beans:property>
</beans:bean>

Controller

@ResponseBody 
	@RequestMapping(value = "/return.json", method = RequestMethod.GET)
	public HashMap<String, Object> json(Locale locale, Model model) {
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		HashMap<String, Object> map2 = new HashMap<String, Object>();
		int[] arr = new int[5];
		for(int i=0; i<arr.length; i++) {
			arr[i] = i;
		}
		
		map2.put("test", 1);
		map2.put("test2", 2);
		
		map.put("string", "테스트");
		map.put("map", map2);
		map.put("array", arr);
		
		return map;
	}

위와 같이 설정하면 다음과 같이 json형태로 응답이 날라오는 것을 볼 수 있다.

 

 

그러나... 원인은 모르겠지만 IE로하면 json 응답이 다운로드가 되는 경우가 있다.... 

해결법을 찾아봤을 때는 주로 응답 header 설정에 관한 방법들이 많았는데, 나의 경우는 해결이 되지 않았다.

 

 

 

그래서 다음과 같이 messageConverter를 이용하여 헤더를 정해주는 방법을 사용하니 일단은 해결...

 

<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
	<beans:property name="order" value="0"/>      
</beans:bean>    
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
	<beans:list>    
	     <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
	          <beans:property name="supportedMediaTypes">
	               <beans:list>
	                    <beans:value>text/html;charset=UTF-8</beans:value>
	                        <beans:value>application/json;charset=UTF-8</beans:value>
	                    </beans:list>
	                </beans:property>
	            </beans:bean>            
	          <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
	      </beans:list>
     </beans:property>                        
</beans:bean>

 

 

+ json 응답에서 null 값을 공백으로 만드는 법

 

NullSerializer.java

public class NullSerializer extends JsonSerializer<Object> {
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        jsonGenerator.writeString("");
    }
}

CustomObjectMapper.java

public class CustomObjectMapper extends ObjectMapper {
	
	private static final long serialVersionUID = 1L;

	public CustomObjectMapper() {
        DefaultSerializerProvider.Impl sp = new DefaultSerializerProvider.Impl();
        sp.setNullValueSerializer(new NullSerializer());
        this.setSerializerProvider(sp);
    }
}

CustomObjectMapper를 빈으로 추가하고 MappingJackson2HttpMessageConverter의 objectMapper로 주입시킨다.

<beans:bean id="objectMapper" class="ssm.example.util.CustomObjectMapper" />  
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
	<beans:property name="order" value="0"/>      
</beans:bean>    
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
     <beans:list>    
         <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
             <beans:property name="supportedMediaTypes">
                 <beans:list>
                     <beans:value>text/html;charset=UTF-8</beans:value>
                     <beans:value>application/json;charset=UTF-8</beans:value>
                 </beans:list>
             </beans:property>
         </beans:bean>            
         <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
         	<beans:property name="objectMapper" ref="objectMapper"></beans:property>       
         </beans:bean>
     </beans:list>
    </beans:property>                        
</beans:bean>

 

댓글