Spring MVC 增加自定義HttpMessageConverter

 前提:

spring版本:       
<spring.version>4.3.22.RELEASE</spring.version>

JDK1.8

代碼說明:

  1. 由於使用了一個SVN庫,因此將代碼導出來吧,可以共大家參考。
  2. 關注點:
  3. 代碼zip壓縮包
     


實操步驟:

  1. 按照官方文檔增加【org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 】bean(在xml文件中配置),並不能實現增加自定義的HttpMessageConverter,並且還會使SpringWEB容器中存在兩個RequestMappingHandlerAdapter 對象,從而引發異常。
    官方配置文檔地址https://docs.spring.io/spring/docs/4.3.22.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-requestbody
    章節:

    示例配置


    我的spring配置文件:
      <!-- 增加解析xml -->
      <bean id="requestMappingHandlerAdapter"
            class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
            p:messageConverters-ref="messageConverters"></bean>
    
     <util:list id="messageConverters">
            <bean
                class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                <property name="marshaller" ref="xStreamMarshaller"></property>
                <property name="unmarshaller"
                    ref="xStreamMarshaller"></property>
            </bean>
            <bean
                class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"></bean>
            <bean
                class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
            <bean
                class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
            <bean
                class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
            <bean
                class="org.springframework.http.converter.BufferedImageHttpMessageConverter"></bean>
        </util:list>
    
        <bean id="xStreamMarshaller"
            class="org.springframework.oxm.xstream.XStreamMarshaller">
            <property name="streamDriver">
                <!-- stax對XML消息進行處理,佔用內存少,響應速度也快 -->
                <bean
                    class="com.thoughtworks.xstream.io.xml.StaxDriver">
                </bean>
            </property>
        </bean>

    實際使用會引發異常。由於想使用XML返回值,因此按照官方文檔,並參照《精通Spring 4.x  企業應用開發實戰》章節17.2.5中關於使用HttpMessageConverter,進行配置,跑起來並不能返回XML,如下是我的代碼及測試:

    期望能夠響應XML,但是未能如願。爲了查看一下RequestMappingHandlerAdapter中是否,已經有了我增加的解析XML的HttpMessageConverter,將註釋掉拿掉,代碼如下:
     

     @PostMapping("handleBodyStudentJson")
      @ResponseBody
      public Student handleBodyStudentJson(HttpServletRequest httpServletRequest) {
        RequestMappingHandlerAdapter adapter = applicationContext.getBean(RequestMappingHandlerAdapter.class);
        logger.info("請求期望響應類型:{}", httpServletRequest.getHeader("Accept"));
        return new Student("小安", 25, new ArrayList<>());
      }

    目標是調試,然後看一下變量adapter中是否有解析XML的 org.springframework.http.converter.xml.MarshallingHttpMessageConverter,再次請求,響應,及結果如圖。

    這就出現了上面我提到的異常。

  2. 看來這樣子是不行的,繼續查找Spring的官方文檔(還是同一份官方文檔),發現瞭如下:
  3. 再次修改配置文件如下:
    <mvc:annotation-driven
            conversion-service="conversionService">
            <mvc:message-converters>
                <ref bean="marshallingHttpMessageConverter" />
            </mvc:message-converters>
        </mvc:annotation-driven>
        <bean id="marshallingHttpMessageConverter"
            class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
            <property name="marshaller" ref="xStreamMarshaller" />
            <property name="unmarshaller" ref="xStreamMarshaller" />
        </bean>
        <bean id="xStreamMarshaller"
            class="org.springframework.oxm.xstream.XStreamMarshaller">
            <property name="streamDriver">
                <!-- stax對XML消息進行處理,佔用內存少,響應速度也快 -->
                <bean
                    class="com.thoughtworks.xstream.io.xml.StaxDriver">
                </bean>
            </property>
        </bean>

     

  4. 再次請求,可以獲取到XML響應。
  5. 若想獲取JSON數據,只需將Accept修改爲application/json,當然pom文件得增加jackson依賴。測試如下:
  6. 完整的POM提供一份:
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.an</groupId>
        <artifactId>spring-mvc-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <properties>
            <java.version>1.8</java.version>
            <spring.version>4.3.22.RELEASE</spring.version>
            <commons-logging.version>1.2</commons-logging.version>
            <log4j.version>2.11.1</log4j.version>
            <jackson.version>2.9.8</jackson.version>
            <validation-api.version>2.0.1.Final</validation-api.version>
            <hibernate-validator.version>6.0.8.Final</hibernate-validator.version>
        </properties>
        <dependencies>
            <!-- 數據校驗支持 -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>${hibernate-validator.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
                <version>${validation-api.version}</version>
            </dependency>
    
            <!-- JSON支持 -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <!-- WEB項目,log4j2配置 -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-web</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <!-- 增加JSON -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- commons logs -->
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>${commons-logging.version}</version>
            </dependency>
    
            <!-- Spring 相關 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-oxm</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.11.1</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <debug>true</debug>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>


     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章