<서론>
스프링 @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 |