Spring Boot有许多启动器,其中包括Spring MVC。请注意,某些入门者包括对Spring MVC的依赖,而不是直接包含它。本部分回答有关Spring MVC和Spring Boot的常见问题。
4.1. 编写JSON REST服务
@RestController
只要Jackson2在类路径上,Spring Boot应用程序中的任何Spring默认情况下都应呈现JSON响应,如以下示例所示:
@RestController
public class MyController {
@RequestMapping("/thing")
public MyThing thing() {
return new MyThing();
}
}
只要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渲染器,请将以下依赖项添加到您的项目中:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
如果无法使用Jackson的XML扩展名而可以使用JAXB,则可以将XMLMyThing
注释为@XmlRootElement
,并具有附加要求,如以下示例所示:
@XmlRootElement
public class MyThing {
private String name;
// .. getters and setters
}
JAXB仅在Java 8中是开箱即用的。如果您使用的是较新的Java版本,请在项目中添加以下依赖项:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</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还具有一些功能,可以更轻松地自定义此行为。
您可以使用环境配置ObjectMapper
和XmlMapper
实例。Jackson提供了丰富的开/关功能套件,可用于配置其处理的各个方面。在六个枚举(在Jackson中)中描述了这些功能,这些枚举映射到环境中的属性:
枚举 | 属性 | 价值观 |
---|---|---|
com.fasterxml.jackson.databind.DeserializationFeature |
spring.jackson.deserialization.<feature_name> |
true , false |
com.fasterxml.jackson.core.JsonGenerator.Feature |
spring.jackson.generator.<feature_name> |
true , false |
com.fasterxml.jackson.databind.MapperFeature |
spring.jackson.mapper.<feature_name> |
true , false |
com.fasterxml.jackson.core.JsonParser.Feature |
spring.jackson.parser.<feature_name> |
true , false |
com.fasterxml.jackson.databind.SerializationFeature |
spring.jackson.serialization.<feature_name> |
true , false |
com.fasterxml.jackson.annotation.JsonInclude.Include |
spring.jackson.default-property-inclusion |
always ,non_null ,non_absent ,non_default ,non_empty |
例如,要启用漂亮打印,请设置spring.jackson.serialization.indent_output=true
。请注意,由于使用了宽松的绑定,的大小写indent_output
不必与相应的枚举常量的大小写匹配INDENT_OUTPUT
。
这种基于环境的配置适用于自动配置的Jackson2ObjectMapperBuilder
Bean,并且适用于使用构建器创建的任何映射器,包括自动配置的ObjectMapper
Bean。
上下文Jackson2ObjectMapperBuilder
可以由一个或多个Jackson2ObjectMapperBuilderCustomizer
bean自定义。可以对此类定制器bean进行排序(Boot自己的定制器的顺序为0),从而可以在Boot定制之前和之后应用其他定制。
任何类型的bean都会com.fasterxml.jackson.databind.Module
自动向自动配置中注册,Jackson2ObjectMapperBuilder
并应用于ObjectMapper
它创建的任何实例。当您向应用程序中添加新功能时,这提供了一种用于贡献自定义模块的全局机制。
如果要ObjectMapper
完全替换默认值,请定义@Bean
该类型的a并将其标记为,@Primary
或者,如果您更喜欢基于构建器的方法,请定义一个Jackson2ObjectMapperBuilder
@Bean
。请注意,无论哪种情况,这样做都会禁用的所有自动配置ObjectMapper
。
如果提供任何@Beans
type MappingJackson2HttpMessageConverter
,它们将替换MVC配置中的默认值。此外,HttpMessageConverters
还提供了一种类型的便捷bean (如果使用默认的MVC配置,该bean始终可用)。它提供了一些有用的方法来访问默认的和用户增强的消息转换器。
请参阅“自定义@ResponseBody渲染”部分和WebMvcAutoConfiguration
源代码以获取更多详细信息。
4.4. 自定义@ResponseBody渲染
Spring用于HttpMessageConverters
呈现@ResponseBody
(或的响应@RestController
)。您可以通过在Spring Boot上下文中添加适当类型的bean来贡献额外的转换器。如果您添加的bean的类型无论如何都是默认包含的(例如MappingJackson2HttpMessageConverter
JSON转换),它将替换默认值。HttpMessageConverters
提供了类型的便捷bean,如果您使用默认的MVC配置,它将始终可用。它提供了一些有用的方法来访问默认的和用户增强的消息转换器(例如,如果您想将它们手动注入到custom中,可能会很有用RestTemplate
)。
与正常的MVC用法一样,WebMvcConfigurer
您提供的任何bean也可以通过重写configureMessageConverters
方法来贡献转换器。但是,与普通的MVC不同,您只能提供所需的其他转换器(因为Spring Boot使用相同的机制来提供其默认值)。最后,如果您通过提供自己的@EnableWebMvc
配置选择退出Spring Boot的默认MVC配置,则可以完全控制并使用getMessageConverters
from手动进行所有操作WebMvcConfigurationSupport
。
请参阅WebMvcAutoConfiguration
源代码以获取更多详细信息。
4.5. 处理分段文件上传
Spring Boot包含Servlet 3 javax.servlet.http.Part
API以支持上传文件。默认情况下,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
spring.mvc.servlet.path=/acme
如果您有其他servlet,则可以声明一个或@Bean
类型,然后Spring Boot会将它们透明地注册到容器。由于Servlet是通过这种方式注册的,因此可以将它们映射到的子上下文而无需调用它。Servlet``ServletRegistrationBean``DispatcherServlet
配置DispatcherServlet
您自己是不寻常的,但是如果您确实需要这样做,则还必须提供一个@Bean
typeDispatcherServletPath
以提供您的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来覆盖。
有关更多详细信息,请参见以下部分: