ViewResolver 중에 ContentNegotiatingViewResolver 에대한 메모를 한다.

아마 활용도가 가장 많을듯 싶다.


기존에 "Spring Security(스프링 시큐리티) Exception(인증, 허가)에 따른 공통 처리" 에서 살짝 소스로만 남겨놨었는데 그때는 호출 경로(확장자)에 따른 View선택 방식이였다.

(http://localhost/test.do HTML 데이터 리턴, http://localhost/test.json JSON 데이터 리턴, http://localhost/test.xml XML 데이터 리턴)


그런데 위 Security 셈플링을 하였을때는 더 세부적으로 하지 않아서 몰랐었는데 인증 및 권한획득 과정에서 문제가 발생하였다.


예를 들어 Security를 이용하여 로그인을 시도 하였을때, 인증 실패등의 Exception 상황에 맞는(html,json,xml)을 정보를 리턴해주어야 하는데 Security에서 제공하는 "http://..../j_spring_security_check" 에서는 json, xml 확장자를 붙일수 없다는것이었다.

form-login 의 login-processing-url 속성으로 변경은 가능하지만 현재 do, json, xml 등 1개 이상 등록이 설정파일에서는 못 하는것 같았다.(나만 모를수도...)


그래서 확장자를 통한 방법이 아닌 mediaType 따른 분기 방법을 셈플링 해보았다.

인터넷 상에 MediaTypes 를 ContentNegotiationManagerFactoryBean 에 바로 setter 하는 셈플들이 많을텐데, 3.2 버전인가 어디에서 충돌 버그인가 머시기인가 문제가 있어서 최근 버전에서는 setMediaTypes가 @Deprecated 되었다고 한다.

만약 문제 발생시 디컴파일러를 통해서 해당 함수의 @Deprecated 여부를 확인해보세요!!


MediaType 방식을 사용할경우 Request Header 정보에 따라서 뷰를 결정하게 된다.

Accept 값이 = application/json ....

application/xml ....

= text/html ... 등등등


이러한 값들은 jQuery를 사용할 경우 별도 셋팅이 필요 없이, jQuery.ajax({dataType: "json"....)  값에 따라 자동 셋팅됩니다.



[servlet-context.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
    <mvc:annotation-driven />
    <context:component-scan base-package="pe.kr.ddakker" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan>
 
    <mvc:interceptors>
        <bean class="pe.kr.ddakker.dakmoney.web.servlet.interceptor.TestInterceptor"/>
    </mvc:interceptors>
 
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    	<property name="order" value="1" />
	    <property name="contentNegotiationManager">
	        <bean class="org.springframework.web.accept.ContentNegotiationManager">
	        	<constructor-arg>
		            <bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy">
		            </bean>
	            </constructor-arg>
	        </bean>
	    </property>
	    <property name="defaultViews">
	        <list>
	            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
	        </list>
	    </property>
	</bean>

	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="order" value="2" />
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

spring 3.2.9 에서 테스트

+ Recent posts