스프링2012. 8. 10. 11:45

<서론>

스프링 @MVC에서 ContentsNagotiator에서 JacksonJsonView로 자동으로 JSON으로 결과물을 생성되게 만들었습니다.
그과정에서 한가지 이슈가 있었습니다.
무엇이냐면 JSON을 리턴할때 무조건 객체가 2depth 이상으로 생성이 된다는 것입니다.

만약 컨트롤러에 아래와 같은 코드가 있다면,

   1: ModelAndView mav = new ModelAndView();
   2: mav.addObject(listOfObjects);
   3: return mav;

아래와 같은 JSON이 생성이 됩니다.


   1: {"objectList" : [{"name":"object1"}, {"name":"object2"}]}

그러나 제가 원하는 JSON은 아래와 같습니다.


   1: [{"name":"object1"}, {"name":"object2"}]


 

<본론>
해결 방안은 기본 JacksonJsonView를 상속하여 filterModel함수를 오버라이딩 하는 것입니다.


   1: import java.util.Map;
   2: import org.springframework.web.servlet.view.json.MappingJacksonJsonView;
   3:  
   4: public class MappingJacksonJsonViewEx extends MappingJacksonJsonView
   5: {
   6:     @SuppressWarnings("unchecked")
   7:     @Override
   8:     protected Object filterModel(Map<String, Object> model) {
   9:  
  10:         Object result = super.filterModel(model);
  11:         if (!(result instanceof Map)) {
  12:             return result;
  13:         }
  14:         Map map = (Map) result;
  15:         if (map.size() == 1) {
  16:             return map.values().toArray()[0];
  17:         }
  18:         return map;
  19:     }
  20: }

ApplicationContext에 설정하는 내용은 (완전한 내용을 포함하진 않았지만) 아래와 같이 됩니다.


   1: <-- default view-->
   2: <property name="defaultViews">
   3:     <list>
   4:         <ref bean="xmlView" />
   5:         <ref bean="jsonView" />
   6:     </list>
   7: </property>
   8:  
   9: <!-- JSON marshalling view -->
  10: <bean id="jsonView" class="ks.spring.sample.MappingJacksonJsonViewExtension" >
  11:     <property name="renderedAttributes" value="restRoot" />
  12: </bean>


 

<결론>

JSON을 한 depth 밖으로 빼내기 위해서, JacksonJSON Viewer의 기본 Filter를 변경시키는 것입니다.

'스프링' 카테고리의 다른 글

SecurityConfig  (0) 2022.05.25
Spring Boot Sample  (0) 2021.03.07
Singleton Registry = ApplicationContext의 또 다른 이름  (0) 2012.08.31
Spring Security - username 정보 가져오기  (0) 2012.01.09
Role in Spring security  (0) 2011.05.18
Posted by 미랭군