前提:
spring版本:
<spring.version>4.3.22.RELEASE</spring.version>
JDK1.8
代碼說明:
- 由於使用了一個SVN庫,因此將代碼導出來吧,可以共大家參考。
- 關注點:
- 代碼zip壓縮包。
實操步驟:
- 按照官方文檔增加【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,再次請求,響應,及結果如圖。
這就出現了上面我提到的異常。 - 看來這樣子是不行的,繼續查找Spring的官方文檔(還是同一份官方文檔),發現瞭如下:
- 再次修改配置文件如下:
<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>
- 再次請求,可以獲取到XML響應。
- 若想獲取JSON數據,只需將Accept修改爲application/json,當然pom文件得增加jackson依賴。測試如下:
- 完整的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>