21.16 Spring MVC的配置
“21.2.1 在WebApplicationContext中的特殊bean类型” 和”21.2.2 DispatcherServlet的默认配置”这两个章节中,诠释了Spring MVC的特殊bean和被DispatcherServlet所使用的默认实现。在本章中,你会学到关于Spring MVC的额外两种配置方法。它们分别叫做MVC Java config和 MVC XML namespace。
MVC Java config和MVC namespace提供了相似的默认配置方法,都是通过覆写DispatcherServlet的默认值来实现的。这样做的目的是,让大多数应用不得不有一致的配置,并且可从较高级别的架构来配置Spring MVC,这个架构可以作为简单易用的配置起始点,并且基本不需这些配置背后所需的知识。
你可以根据自己的偏好,来选择MVC Java config或者MVC namespace。
不久后你可以见到,使用MVC Java config会更容易见识到配置背后的知识,并且具有更佳的细粒度,来直接配置创建好的Spring MVC的bean。现在,让我们从头开始吧。
21.16.1 启用MVC Java Config或MVC XML Namespace
在需要启用MVC Java config时,在你的某个@Configuration类上写上@EnableWebMvc注解:
@Configuration
@EnableWebMvc
public class WebConfig {
}
同样地,如果需要启用MVC XML Namespace时,在XML中的DispatcherServlet的context中使用mvc:annotation-driven元素(如果在context中没有定义DispatcherServlet,就在你的context根部使用此元素):
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<mvc:annotation-driven/>
</beans>
在上方的配置中,注册了一个RequestMappingHandlerMapping,一个RequestMappingHandlerAdapter,和一个ExceptionHandlerResolver,用来支持处理请求的那些带注解的controller,比如@RequestMapping,@ExceptionHandler等等。
同时,以下行为也会启用:
- 除了用来进行数据绑定的JavaBeans PropertyEditors以外,会通过ConversionService实例来进行Spring 3 风格的类型转换。
- 为了支持使用@NumberFormat注解来格式化Number字段,会使用ConversionService
- 支持使用@DateTimeFormat注解来支持格式化Date,Calendar,Long和Joda Time字段。
- 如果在类路径中出现JSR-303 Provider,会支持使用@Valid来验证@Controller的输入。
- HttpMessageConverter,用来支持@RequestBody方法的参数,和从@RequestMapping或@ExceptionHandler方法的@ResponseBody返回的值。
以下是关于被mvc:annotaion-driven设置的HttpMessageConverters的完整清单:
a. ByteArrayHttpMessageConverter转换字节数组
b. StringHttpMessageConverter转换字符串
c. ResourceHttpMessageConverter和
org.springframework.core.io.Resource之间的所有媒体类型互相转换
d. SourceHttpMessageConverter和javax.xml.transform.Source之间的互相转换
e. FormHttpMessageConverter和MultiValueMap<String,String>之间的表单数据互相转换
f. Jaxb2RootElementHttpMessageConverter和XML之间的Java对象转换——如果类路径下,JAXB2存在并且Jackson 2 XML extension不存在的情况下添加。
g. MappingJackson2HttpMessageConverter和JSON间的互相转换——在类路径下存在Jackson 2时添加。
h. MappingJackson2XmlHttpMessageConverter和XML间的转换——在类路径下存在Jackson 2 XMLextension时添加。
i. AtomFeedHttpMessageConverter转换Atom 订阅——如果类路径下存在Rome时添加。
j. RssChannelHttpMessageConverter转换RSS订阅——如果类路径下存在有Rome时添加。
如需了解更多关于自定义默认转换器的信息,详见”21.16.12 消息转换器”这一章节。
提示:
JacksonJSON 和XML转换器是利用ObjectMapper实例来创建的,这个实例又是通过Jackson2ObjectMapperBuilder来创建的,这样做是为了提供更好的默认配置。
这个builder会自定义Jackson的以下默认属性:
- DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES会被停用
- MapperFeature.DEFAULT_VIEW_INCLUSION会被停用
同时,当某些众所周知的模组在类路径下被检测到时,会自动注册,包括:
- jackson-datatype-jdk7:支持Java 7的类型,比如Java.nio.file.Path
- jackson-datatype-joda:支持Joda-Time类型
- jackson-datatype-jsr310:支持Java 8的Date和Time API的类型
- jackson-datatype-jdk8:支持其他的Java 8 类型,比如Optional