TagCloud

Wednesday, January 9, 2013

ContentNegotiatingViewResolver(mediaType relate) error in SpringFramework 3.2 ( solved by ContentNegotiationManager )

신규 프로젝트를 위해 최신버젼의 환경(java7, tomcat7, springframework 3.2) 등을 적용하여 개발하던 중...
Spring 3.2 에서 기존에서와 같이 ContentNegotiatingViewResolver 를 사용하였는데 오류가 발생..

mediaType 을 캐스팅할 수 없다는 오류로, 환경구성에 문제가 있는줄 알고 이틀간을 파악하였으나...황당하게도 Spring 3.2 로 오면서 ContentNegotiatingViewResolver  적용 방법이 바뀐것을 확인...(최신버젼을 사용하면 고생이라는 말이 괜히 나온게 아니다 ㅠ.ㅠ)

1. 아래는 Spring Framework 3.2 이전 설정 방법.
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="html" value="text/html">
                <entry key="xml" value="application/xml">
            </entry></entry></map>
        </property>
        <property name="order" value="0">
    </property></bean>

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

2. 아래가 Spring Framework 3.2 에서 org.springframework.web.accept.ContentNegotiationManager 을 통해 설정하는 방법.
    <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.PathExtensionContentNegotiationStrategy">
                        <constructor-arg>
                            <map>
                                <entry key="json" value="application/json">
                                <entry key="jsonp" value="javascript/jsonp">
                                <entry key="xml" value="application/xml">
                            </entry></entry></entry></map>
                        </constructor-arg>
                    </bean>
                </constructor-arg>
            </bean>
        </property>


        <property name="defaultViews">
            <list>
                <!-- JSON View -->
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                <!-- JSONP view  -->
                <bean class="com.wemoss.common.view.JSONPView">
                    <property name="contentType" value="javascript/jsonp">
                </property></bean>
                <!-- XML View -->
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                            <property name="packagesToScan">
                                <list>
                                    <value>documentLoader.domain</value>
                                </list>
                            </property>
                        </bean>
                    </constructor-arg>
                </bean>
            </bean></list>
        </property>
    </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">
    </property></property></property></bean>


얼리어댑터 정신을 소프트웨어 개발에 적용하면 고생할 뿐이다...ㅠ.ㅠ