메이쁘

[Spring] API 만들기 위해 ModelAndView jsonview 리턴 작업 시 발생하는 오류 (Dispatcher 설정) 본문

Technology/Web - Spring

[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 맵핑 오류를) 전달하니 오류가 날 수 밖에..

 

 

 

감사하빈다.

 

Comments