Spring Boot有许多启动器,其中包括Spring MVC。请注意,某些入门者包括对Spring MVC的依赖,而不是直接包含它。本部分回答有关Spring MVC和Spring Boot的常见问题。

4.1. 编写JSON REST服务

@RestController只要Jackson2在类路径上,Spring Boot应用程序中的任何Spring默认情况下都应呈现JSON响应,如以下示例所示:

  1. @RestController
  2. public class MyController {
  3. @RequestMapping("/thing")
  4. public MyThing thing() {
  5. return new MyThing();
  6. }
  7. }

只要MyThing可以由Jackson2序列化(对于普通的POJO或Groovy对象为true),则[localhost:8080/thing](http://localhost:8080/thing)默认情况下会为其提供JSON表示。请注意,在浏览器中,有时您可能会看到XML响应,因为浏览器倾向于发送更喜欢XML的接受标头。

4.2. 编写XML REST服务

如果jackson-dataformat-xml类路径上具有Jackson XML扩展名(),则可以使用它来呈现XML响应。我们用于JSON的先前示例可以正常工作。要使用Jackson XML渲染器,请将以下依赖项添加到您的项目中:

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.dataformat</groupId>
  3. <artifactId>jackson-dataformat-xml</artifactId>
  4. </dependency>

如果无法使用Jackson的XML扩展名而可以使用JAXB,则可以将XMLMyThing注释为@XmlRootElement,并具有附加要求,如以下示例所示:

  1. @XmlRootElement
  2. public class MyThing {
  3. private String name;
  4. // .. getters and setters
  5. }

JAXB仅在Java 8中是开箱即用的。如果您使用的是较新的Java版本,请在项目中添加以下依赖项:

  1. <dependency>
  2. <groupId>org.glassfish.jaxb</groupId>
  3. <artifactId>jaxb-runtime</artifactId>
  4. </dependency>
要使服务器呈现XML而不是JSON,您可能必须发送Accept: text/xml标头(或使用浏览器)。

4.3. 自定义Jackson ObjectMapper

Spring MVC(客户端和服务器端)用于HttpMessageConverters协商HTTP交换中的内容转换。如果Jackson在类路径中,则您已经获得所提供的默认转换器,该转换器Jackson2ObjectMapperBuilder的实例已为您自动配置。
ObjectMapper(或XmlMapper为杰克逊XML转换器)实例(默认创建)具有以下定义的属性:

  • MapperFeature.DEFAULT_VIEW_INCLUSION 被禁用
  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 被禁用
  • SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 被禁用

Spring Boot还具有一些功能,可以更轻松地自定义此行为。
您可以使用环境配置ObjectMapperXmlMapper实例。Jackson提供了丰富的开/关功能套件,可用于配置其处理的各个方面。在六个枚举(在Jackson中)中描述了这些功能,这些枚举映射到环境中的属性:

枚举 属性 价值观
com.fasterxml.jackson.databind.DeserializationFeature spring.jackson.deserialization.<feature_name> truefalse
com.fasterxml.jackson.core.JsonGenerator.Feature spring.jackson.generator.<feature_name> truefalse
com.fasterxml.jackson.databind.MapperFeature spring.jackson.mapper.<feature_name> truefalse
com.fasterxml.jackson.core.JsonParser.Feature spring.jackson.parser.<feature_name> truefalse
com.fasterxml.jackson.databind.SerializationFeature spring.jackson.serialization.<feature_name> truefalse
com.fasterxml.jackson.annotation.JsonInclude.Include spring.jackson.default-property-inclusion alwaysnon_nullnon_absentnon_defaultnon_empty

例如,要启用漂亮打印,请设置spring.jackson.serialization.indent_output=true。请注意,由于使用了宽松的绑定,的大小写indent_output不必与相应的枚举常量的大小写匹配INDENT_OUTPUT
这种基于环境的配置适用于自动配置的Jackson2ObjectMapperBuilderBean,并且适用于使用构建器创建的任何映射器,包括自动配置的ObjectMapperBean。
上下文Jackson2ObjectMapperBuilder可以由一个或多个Jackson2ObjectMapperBuilderCustomizerbean自定义。可以对此类定制器bean进行排序(Boot自己的定制器的顺序为0),从而可以在Boot定制之前和之后应用其他定制。
任何类型的bean都会com.fasterxml.jackson.databind.Module自动向自动配置中注册,Jackson2ObjectMapperBuilder并应用于ObjectMapper它创建的任何实例。当您向应用程序中添加新功能时,这提供了一种用于贡献自定义模块的全局机制。
如果要ObjectMapper完全替换默认值,请定义@Bean该类型的a并将其标记为,@Primary或者,如果您更喜欢基于构建器的方法,请定义一个Jackson2ObjectMapperBuilder @Bean。请注意,无论哪种情况,这样做都会禁用的所有自动配置ObjectMapper
如果提供任何@Beanstype MappingJackson2HttpMessageConverter,它们将替换MVC配置中的默认值。此外,HttpMessageConverters还提供了一种类型的便捷bean (如果使用默认的MVC配置,该bean始终可用)。它提供了一些有用的方法来访问默认的和用户增强的消息转换器。
请参阅“自定义@ResponseBody渲染”部分和WebMvcAutoConfiguration源代码以获取更多详细信息。

4.4. 自定义@ResponseBody渲染

Spring用于HttpMessageConverters呈现@ResponseBody(或的响应@RestController)。您可以通过在Spring Boot上下文中添加适当类型的bean来贡献额外的转换器。如果您添加的bean的类型无论如何都是默认包含的(例如MappingJackson2HttpMessageConverterJSON转换),它将替换默认值。HttpMessageConverters提供了类型的便捷bean,如果您使用默认的MVC配置,它将始终可用。它提供了一些有用的方法来访问默认的和用户增强的消息转换器(例如,如果您想将它们手动注入到custom中,可能会很有用RestTemplate)。
与正常的MVC用法一样,WebMvcConfigurer您提供的任何bean也可以通过重写configureMessageConverters方法来贡献转换器。但是,与普通的MVC不同,您只能提供所需的其他转换器(因为Spring Boot使用相同的机制来提供其默认值)。最后,如果您通过提供自己的@EnableWebMvc配置选择退出Spring Boot的默认MVC配置,则可以完全控制并使用getMessageConvertersfrom手动进行所有操作WebMvcConfigurationSupport
请参阅WebMvcAutoConfiguration源代码以获取更多详细信息。

4.5. 处理分段文件上传

Spring Boot包含Servlet 3 javax.servlet.http.PartAPI以支持上传文件。默认情况下,Spring Boot用单个请求将Spring MVC配置为每个文件最大大小为1MB,最大文件数据为10MB。您可以覆盖这些值,使用中间类提供/tmp的属性将中间数据存储到的位置(例如,存储到目录)以及将数据刷新到磁盘的阈值MultipartProperties。例如,如果要指定文件不受限制,请将spring.servlet.multipart.max-file-size属性设置为-1
当您想在Spring MVC控制器处理程序方法中将多部分编码的文件数据作为带@RequestParam注释的类型的参数来接收时,多部分支持会很有帮助MultipartFile
有关MultipartAutoConfiguration更多详细信息,请参见源。

建议使用容器的内置支持进行分段上传,而不要引入其他依赖项,例如Apache Commons File Upload。

4.6. 关闭Spring MVC DispatcherServlet

默认情况下,所有内容均从应用程序的根目录(/)提供。如果您希望映射到其他路径,则可以如下配置:
物产
Yaml

  1. spring.mvc.servlet.path=/acme

如果您有其他servlet,则可以声明一个或@Bean类型,然后Spring Boot会将它们透明地注册到容器。由于Servlet是通过这种方式注册的,因此可以将它们映射到的子上下文而无需调用它。Servlet``ServletRegistrationBean``DispatcherServlet
配置DispatcherServlet您自己是不寻常的,但是如果您确实需要这样做,则还必须提供一个@BeantypeDispatcherServletPath以提供您的custom的路径DispatcherServlet

4.7. 关闭默认的MVC配置

完全控制MVC配置的最简单方法是为您自己@Configuration提供@EnableWebMvc注释。这样做会使您掌握所有MVC配置。

4.8. 自定义ViewResolvers

AViewResolver是Spring MVC的核心组件,将视图名称转换@Controller为实际的View实现。请注意,ViewResolvers它主要用于UI应用程序,而不是REST风格的服务(aView不用于呈现a @ResponseBody)。有很多实现ViewResolver可供选择,Spring本身没有就应该使用哪个实现提出意见。另一方面,Spring Boot会根据您在类路径和应用程序上下文中找到的内容为您安装一个或两个。会DispatcherServlet使用它在应用程序上下文中找到的所有解析器,依次尝试每个解析器,直到获得结果。如果添加自己的解析器,则必须知道其顺序以及解析器的添加位置。
WebMvcAutoConfiguration将以下内容添加ViewResolvers到您的上下文中:

  • 一个InternalResourceViewResolver名为“defaultViewResolver”。此代码查找可以使用渲染的物理资源DefaultServlet(包括静态资源和JSP页面,如果使用的话)。它将一个前缀和一个后缀应用于视图名称,然后在Servlet上下文中查找具有该路径的物理资源(默认值均为空,但可以通过spring.mvc.view.prefix和进行外部配置访问spring.mvc.view.suffix)。您可以通过提供相同类型的bean来覆盖它。
  • 一个BeanNameViewResolver名为“beanNameViewResolver”。这是视图解析器链的有用成员,可以拾取与View被解析名称相同的所有bean 。不必重写或替换它。
  • ContentNegotiatingViewResolver仅当实际存在类型bean的情况下,才添加一个名为“ viewResolver”的视图View。这是一个“主”解析器,委派给所有其他解析器,并尝试查找与客户端发送的“ Accept” HTTP标头匹配的内容。有一个有用的博客ContentNegotiatingViewResolver,您可能想学习以了解更多信息,并且您也可以查看源代码以获取详细信息。您可以ContentNegotiatingViewResolver通过定义一个名为“ viewResolver”的bean来关闭自动配置。
  • 如果您使用Thymeleaf,则还有一个ThymeleafViewResolver名为“ thymeleafViewResolver”。它通过在视图名称前后加上前缀和后缀来查找资源。前缀为spring.thymeleaf.prefix,后缀为spring.thymeleaf.suffix。前缀和后缀的值分别默认为“ classpath:/ templates /”和“ .html”。您可以ThymeleafViewResolver通过提供相同名称的bean来覆盖。
  • 如果您使用FreeMarker,则还有一个FreeMarkerViewResolver名为“ freeMarkerViewResolver”的文件。它spring.freemarker.templateLoaderPath通过在视图名称前加上前缀和后缀来在加载程序路径(已外部化并具有默认值’classpath:/ templates /‘)中查找资源。前缀被外部spring.freemarker.prefix化为,后缀被外部化为spring.freemarker.suffix。前缀和后缀的默认值分别为空和’.ftlh’。您可以FreeMarkerViewResolver通过提供相同名称的bean来覆盖。
  • 如果您使用Groovy模板(实际上,如果groovy-templates在类路径中),则还具有一个GroovyMarkupViewResolver名为“ groovyMarkupViewResolver”的名称。它通过在视图名称周围添加前缀和后缀(spring.groovy.template.prefix并扩展为和spring.groovy.template.suffix)来查找加载程序路径中的资源。前缀和后缀分别具有默认值’classpath:/ templates /‘和’.tpl’。您可以GroovyMarkupViewResolver通过提供相同名称的bean来覆盖。
  • 如果您使用Moustache,则还有一个MustacheViewResolver名为“ mustacheViewResolver”的文件。它通过在视图名称前后加上前缀和后缀来查找资源。前缀为spring.mustache.prefix,后缀为spring.mustache.suffix。前缀和后缀的值分别默认为“ classpath:/ templates /”和“ .mustache”。您可以MustacheViewResolver通过提供相同名称的bean来覆盖。

有关更多详细信息,请参见以下部分: