- Today
- Yesterday
- Total
메이쁘
[Spring] API 만들기 위해 ModelAndView jsonview 리턴 작업 시 발생하는 오류 (Dispatcher 설정) 본문
[Spring] API 만들기 위해 ModelAndView jsonview 리턴 작업 시 발생하는 오류 (Dispatcher 설정)
메이쁘 2021. 4. 17. 23:49안녕하세요.
API 서버 만들다가 하도 오류나서 적어보게 되었습니다.
하이고..
Json 객체를 response 해주기 위해서, 객체에 값을 담아 리턴하는 컨트롤러 함수를 구현했습니다.
이를 위해서, ModelAndView 객체 생성 시(또는 setViewName 시) "jsonView" 로 설정하여 ModelAndView 객체를 리턴해줬습니다.
하지만...
No mapping found for HTTP request with URI [/] in DispatcherServlet with name 'app'
멘붕..
자꾸 URI를 알 수 없다고 합니다.
분명 RequestMapping도 그렇고, @Controller 어노테이션도 달았는데 말이죠.
한참 찾다가,, 초보적인 실수를 범한 걸 깨달았습니다.
Dispatcher-servlet.xml 에 Bean 설정을 안했다는걸요..
참고로, 처음 프로젝트 생성할때 저 파일은 없었습니다.. 해결하려고 여기저기 검색하다 만들게 되었습니다.
*** (WEB-INF/config/dispatcher-servlet.xml) 경로에 만들었습니다.
그럼, 어떻게 해결했는지 적어보겠습니다.
해결방법
1. web.xml에서 dispatcher-servlet.xml 연결
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2. dispatcher-servlet.xml에 RequestMappingHandlerAdapter, RequestMappingHandlerMapping bean 정의
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="alwaysUseFullPath" value="true"></property>
</bean>
3. (중요) MappingJackson2JsonView bean 생성(order 즉, 우선순위 0으로 설정)
4. BeanNameViewResolver bean 생성(우선순위 1)
5. InternalResourceViewResolver bean 생성(우선순위 2. jsp view 리턴을 위함)
<!-- ajax를 처리할 resolver의 load 순서를 0으로 하여 먼저 인식하도록 함 -->
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="contentType" value="application/json;charset=UTF-8"></property>
</bean>
<!-- order 프로퍼티를 수정하여 인식 순서를 변경 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"></property></bean>
<!-- 여러가지를 먼저 처리할 resolver가 있는 경우 스프링 기본제공 resolver는 최하위 순서가 되는 경우가 많다. 그냥 맨 뒤로 빼자 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/**/" p:suffix=".jsp" p:order="2">
</bean>
즉, jsonView를 ModelAndView에 설정해서 보내려고 할 때, 우선순위를 나누질 않으니 자꾸 Dispatcher가 요청받는 것을 views/jsonview.jsp 형식으로(또는, URI 맵핑 오류를) 전달하니 오류가 날 수 밖에..
감사하빈다.