18.16配置Spring MVC
第18.2.1节“WebApplicationContext中的特殊Bean类型”和第18.2.2节“默认DispatcherServlet配置”解释了Spring MVC的特殊bean以及该使用的默认实现DispatcherServlet
。在本节中,您将了解配置Spring MVC的两种其他方法。即MVC Java配置和MVC XML命名空间。
MVC Java配置和MVC命名空间提供了类似的默认配置,可以覆盖DispatcherServlet
默认配置。目标是使大多数应用程序不必创建相同的配置,并提供更高级别的构造,用于配置作为简单起始点的Spring MVC,并且需要很少或根本没有底层配置的知识。
您可以根据自己的喜好选择MVC Java配置或MVC命名空间。另外,您将在下面进一步看到,使用MVC Java配置,可以更容易地查看底层配置,以及直接对创建的Spring MVC bean进行细粒度的自定义。但是让我们从一开始就开始。
要启用MVC Java配置,请将注释添加@EnableWebMvc
到您的一个 @Configuration
类中:
@Configuration @EnableWebMvc public class WebConfig { }
要在XML中实现相同的使用mvc:annotation-driven
DispatcherServlet上下文中的元素(如果您没有定义DispatcherServlet上下文,则在根上下文中):
<?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:注释驱动/> </豆>
在上述寄存器一RequestMappingHandlerMapping
,一个RequestMappingHandlerAdapter
,和ExceptionHandlerExceptionResolver
在支持带注释控制器方法的处理请求(等等)使用注释诸如@RequestMapping
, @ExceptionHandler
和其他。
它还支持以下功能:
- 除了用于数据绑定的JavaBeans PropertyEditor之外,还可以 通过ConversionService实例进行Spring 3样式类型转换。
- 支持格式使用数字字段
@NumberFormat
通过注释ConversionService
。 - 支持的格式
Date
,Calendar
,Long
,和乔达时间使用的字段@DateTimeFormat
注解。 - 支持验证
@Controller
输入@Valid
,如果JSR-303提供程序存在于类路径中。 -
HttpMessageConverter
支持@RequestBody
方法参数和@ResponseBody
方法返回值@RequestMapping
或@ExceptionHandler
方法。这是由mvc设计的HttpMessageConverters的完整列表:annotation-driven:
-
ByteArrayHttpMessageConverter
转换字节数组。 -
StringHttpMessageConverter
转换字符串。 -
ResourceHttpMessageConverter
转换为/从org.springframework.core.io.Resource
为所有媒体类型。 -
SourceHttpMessageConverter
转换到/从ajavax.xml.transform.Source
。 -
FormHttpMessageConverter
将表单数据转换为/从a转换MultiValueMap<String, String>
。 -
Jaxb2RootElementHttpMessageConverter
将Java对象转换为/从XML中添加 – 如果存在JAXB2,并且类别路径中不存在Jackson 2 XML扩展名。 -
MappingJackson2HttpMessageConverter
转换为/从JSON中添加,如果杰克逊2存在于类路径。 -
MappingJackson2XmlHttpMessageConverter
转换为/从XML中添加,如果 Jackson 2 XML扩展存在于类路径中。 -
MappingJackson2SmileHttpMessageConverter
转换为/从微笑(二进制JSON) – 添加如果 杰克逊2微笑扩展 存在于类路径。 -
MappingJackson2CborHttpMessageConverter
转换为/从CBOR – 添加如果 杰克逊2 CBOR扩展 存在于类路径。 -
AtomFeedHttpMessageConverter
转换Atom Feed – 如果罗马存在于类路径中则添加。 -
RssChannelHttpMessageConverter
转换RSS提要 – 如果罗马存在于类路径中,则会添加。
-
有关如何自定义这些默认转换器的更多信息,请参见第18.16.12节“消息转换器”。
使用ObjectMapper 创建的实例创建 Jackson JSON和XML转换器Jackson2ObjectMapperBuilder ,以提供更好的默认配置。此构建器使用以下命令自定义Jackson的默认属性:
如果在类路径中检测到它们,它也会自动注册以下众所周知的模块:
|
要定制Java中的默认配置,您只需实现该 WebMvcConfigurer
接口,或者更有可能扩展该类WebMvcConfigurerAdapter
并覆盖所需的方法:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { //覆盖配置方法... }
要自定义默认配置,<mvc:annotation-driven/>
检查它支持哪些属性和子元素。您可以查看 Spring MVC XML模式或使用IDE的代码完成功能来发现哪些属性和子元素可用。
默认情况下,已安装格式化程序Number
和Date
类型,包括对@NumberFormat
和@DateTimeFormat
注释的支持。如果Joda时间存在于类路径上,则还将完全支持Joda Time格式化库。要注册自定义格式化程序和转换器,请覆盖该addFormatters
方法:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addFormatters(FormatterRegistry registry){ //添加格式化程序和/或转换器 } }
在MVC命名空间<mvc:annotation-driven>
中,添加相同的默认值。注册自定义格式化器和转换器只需提供一个ConversionService
:
<?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 conversion-service = “conversionService” /> <豆 ID = “conversionService” 类 = “org.springframework.format.support.FormattingConversionServiceFactoryBean” > <属性 名 = “转换器” > <设定> <豆 类 = “org.example.MyConverter” /> </设定> < / property> <property name = “formatters” > <set> <bean class = “org.example.MyFormatter” /> <bean class = “org.example。MyAnnotationFormatterFactory“ /> </ set> </ property> <property name = ”formatterRegistrars“ > <set> <bean class = ”org.example.MyFormatterRegistrar“ /> </ set> </ property> </ bean> </豆>
参见5.6.4节,“FormatterRegistrar SPI”和FormattingConversionServiceFactoryBean 关于何时使用FormatterRegistrars更多的信息。 |
Spring提供了一个验证器接口,可用于在应用程序的所有层中进行验证。在Spring MVC中,您可以将其配置为用作全局Validator
实例,以在遇到@Valid
或@Validated
控制器方法参数时使用,和/或Validator
通过@InitBinder
方法作为控制器中的本地 使用。可以组合全局和本地验证器实例以提供复合验证。
Spring还支持JSR-303 / JSR-349 Bean验证,通过LocalValidatorFactoryBean
它可以将Spring org.springframework.validation.Validator
界面适应Bean验证javax.validation.Validator
合同。这个类可以插入Spring MVC作为下面描述的全局验证器。
默认情况下,通过在类路径中检测到一个Bean验证提供程序(如Hibernate Validator)时,可以在Spring MVC中使用@EnableWebMvc
或<mvc:annotation-driven>
自动注册Bean验证支持LocalValidatorFactoryBean
。
有时,将LocalValidatorFactoryBean 注入到控制器或其他类中是很方便的。最简单的方法是声明自己的@Bean ,并且标记它,@Primary 以避免与MVC Java配置提供的冲突。如果你喜欢使用MVC的Java的配置之一,你需要重写 mvcValidator 的方法WebMvcConfigurationSupport ,并声明明确回报的方法LocalValidatorFactory ,而不是Validator 。有关 如何切换扩展提供的配置的信息,请参见第18.16.13节“使用MVC Java Config进行高级定制”。 |
或者,您可以配置自己的全局Validator
实例:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public Validator getValidator(); { //返回“全局”验证器 } }
和XML:
<?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 validator = “globalValidator” /> </豆>
要将全局和本地验证结合起来,只需添加一个或多个本地验证器:
@Controller public class MyController { @InitBinder protected void initBinder(WebDataBinder binder){ binder.addValidators(new FooValidator()); } }
使用这个最小配置,任何时候遇到一个@Valid
或@Validated
方法参数,它将被配置的验证器验证。任何验证违规将自动BindingResult
作为方法参数可访问的错误公开,并且也可以在Spring MVC HTML视图中呈现。
您可以配置HandlerInterceptors
或WebRequestInterceptors
应用于所有传入的请求或限制在特定的URL路径模式。
在Java中注册拦截器的示例:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry){ registry.addInterceptor(new LocaleInterceptor()); registry.addInterceptor(new ThemeInterceptor())。addPathPatterns(“/ **”).excludePathPatterns(“/ admin / **”); registry.addInterceptor(new SecurityInterceptor())。addPathPatterns(“/ secure / *”); } }
而在XML中使用<mvc:interceptors>
元素:
<mvc:interceptors> <bean class = “org.springframework.web.servlet.i18n.LocaleChangeInterceptor” /> <mvc:interceptor> <mvc:mapping path = “/ **” /> <mvc:exclude-mapping path = “/ admin / **” /> <bean class = “org.springframework.web.servlet.theme.ThemeChangeInterceptor” /> </ mvc:interceptor> <mvc:interceptor> <mvc:mapping path = “/ secure / “ /> <bean class = ”org.example.SecurityInterceptor“/> </ mvc:interceptor> </ mvc:interceptors>