此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1Spring中文文档

Spring Boot 有许多包括 Spring MVC 在内的启动器。 请注意,一些启动器包含对 Spring MVC 的依赖,而不是直接包含它。 本节回答有关 Spring MVC 和 Spring Boot 的常见问题。Spring中文文档

编写 JSON REST 服务

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

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

	@RequestMapping("/thing")
	public MyThing thing() {
		return new MyThing();
	}

}
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class MyController {

	@RequestMapping("/thing")
	fun thing(): MyThing {
		return MyThing()
	}

}

只要可以被 Jackson2 序列化(对于普通的 POJO 或 Groovy 对象为 true),那么默认情况下会提供它的 JSON 表示形式。 请注意,在浏览器中,有时可能会看到 XML 响应,因为浏览器倾向于发送首选 XML 的接受标头。MyThinglocalhost:8080/thingSpring中文文档

编写 XML REST 服务

如果类路径上有 Jackson XML 扩展 (),则可以使用它来呈现 XML 响应。 我们用于 JSON 的上一个示例将起作用。 若要使用 Jackson XML 呈现器,请将以下依赖项添加到项目中:jackson-dataformat-xmlSpring中文文档

<dependency>
	<groupId>com.fasterxml.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-xml</artifactId>
</dependency>

如果 Jackson 的 XML 扩展不可用而 JAXB 可用,则可以呈现 XML,并附加要求将 注释为 ,如以下示例所示:MyThing@XmlRootElementSpring中文文档

import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class MyThing {

	private String name;

	// getters/setters ...

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
import jakarta.xml.bind.annotation.XmlRootElement

@XmlRootElement
class MyThing {

	var name: String? = null

}

您需要确保 JAXB 库是项目的一部分,例如,通过添加:Spring中文文档

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

自定义 Jackson ObjectMapper

Spring MVC(客户端和服务器端)用于协商 HTTP 交换中的内容转换。 如果 Jackson 在类路径上,则您已经获得了 提供的默认转换器,该转换器的实例会自动为您配置。HttpMessageConvertersJackson2ObjectMapperBuilderSpring中文文档

(或对于 Jackson XML 转换器)实例(默认创建)具有以下自定义属性:ObjectMapperXmlMapperSpring中文文档

Spring Boot 还具有一些功能,可以更轻松地自定义此行为。Spring中文文档

您可以使用环境配置 and 实例。 Jackson 提供了一套广泛的开/关功能,可用于配置其处理的各个方面。 这些功能在映射到环境中属性的几个枚举(在 Jackson 中)中进行了描述:ObjectMapperXmlMapperSpring中文文档

枚举 财产

com.fasterxml.jackson.databind.cfg.EnumFeatureSpring中文文档

spring.jackson.datatype.enum.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.cfg.JsonNodeFeatureSpring中文文档

spring.jackson.datatype.json-node.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.DeserializationFeatureSpring中文文档

spring.jackson.deserialization.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.core.JsonGenerator.FeatureSpring中文文档

spring.jackson.generator.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.MapperFeatureSpring中文文档

spring.jackson.mapper.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.core.JsonParser.FeatureSpring中文文档

spring.jackson.parser.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.SerializationFeatureSpring中文文档

spring.jackson.serialization.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.annotation.JsonInclude.IncludeSpring中文文档

spring.jackson.default-property-inclusionSpring中文文档

always, , , ,non_nullnon_absentnon_defaultnon_emptySpring中文文档

例如,要启用漂亮的打印,请设置 . 请注意,由于使用了宽松绑定,因此 的情况不必与相应的枚举常量的情况匹配,即 。spring.jackson.serialization.indent_output=trueindent_outputINDENT_OUTPUTSpring中文文档

此基于环境的配置将应用于自动配置的 Bean,并应用于使用构建器创建的任何映射器,包括自动配置的 Bean。Jackson2ObjectMapperBuilderObjectMapperSpring中文文档

上下文可以由一个或多个 Bean 自定义。 可以对此类定制器 Bean 进行排序(Boot 自己的定制器的顺序为 0),从而在 Boot 定制之前和之后应用其他定制。Jackson2ObjectMapperBuilderJackson2ObjectMapperBuilderCustomizerSpring中文文档

任何类型的 Bean 都会自动注册到自动配置的 Bean,并应用于它创建的任何实例。 这提供了一种全局机制,用于在向应用程序添加新功能时贡献自定义模块。com.fasterxml.jackson.databind.ModuleJackson2ObjectMapperBuilderObjectMapperSpring中文文档

如果要完全替换默认值,请定义该类型的 a 并将其标记为 ,或者,如果您更喜欢基于构建器的方法,请定义 . 请注意,无论哪种情况,这样做都会禁用 .ObjectMapper@Bean@PrimaryJackson2ObjectMapperBuilder@BeanObjectMapperSpring中文文档

如果提供 的任何类型,它们将替换 MVC 配置中的默认值。 此外,还提供了 Easy Bean 类型(如果使用默认 MVC 配置,则始终可用)。 它有一些有用的方法来访问默认和用户增强的消息转换器。@BeansMappingJackson2HttpMessageConverterHttpMessageConvertersSpring中文文档

有关详细信息,请参阅“自定义@ResponseBody呈现”部分和 WebMvcAutoConfiguration 源代码。Spring中文文档

枚举 财产

com.fasterxml.jackson.databind.cfg.EnumFeatureSpring中文文档

spring.jackson.datatype.enum.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.cfg.JsonNodeFeatureSpring中文文档

spring.jackson.datatype.json-node.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.DeserializationFeatureSpring中文文档

spring.jackson.deserialization.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.core.JsonGenerator.FeatureSpring中文文档

spring.jackson.generator.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.MapperFeatureSpring中文文档

spring.jackson.mapper.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.core.JsonParser.FeatureSpring中文文档

spring.jackson.parser.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.databind.SerializationFeatureSpring中文文档

spring.jackson.serialization.<feature_name>Spring中文文档

true,falseSpring中文文档

com.fasterxml.jackson.annotation.JsonInclude.IncludeSpring中文文档

spring.jackson.default-property-inclusionSpring中文文档

always, , , ,non_nullnon_absentnon_defaultnon_emptySpring中文文档

自定义@ResponseBody渲染

Spring 用于渲染(或来自 的响应)。 您可以通过在 Spring Boot 上下文中添加适当类型的 Bean 来贡献其他转换器。 如果添加的 Bean 属于默认情况下都会包含的类型(例如,对于 JSON 转换),则它将替换缺省值。 提供了一种便利的 Bean,如果使用默认的 MVC 配置,则该 Bean 始终可用。 它有一些有用的方法来访问默认和用户增强的消息转换器(例如,如果您想手动将它们注入自定义 )。HttpMessageConverters@ResponseBody@RestControllerMappingJackson2HttpMessageConverterHttpMessageConvertersRestTemplateSpring中文文档

与正常的 MVC 用法一样,您提供的任何 Bean 也可以通过重写该方法来贡献转换器。 但是,与普通 MVC 不同的是,您只能提供所需的其他转换器(因为 Spring Boot 使用相同的机制来贡献其默认值)。 最后,如果您通过提供自己的配置来选择退出默认的 Spring Boot MVC 配置,则可以使用 from 完全控制并手动执行所有操作。WebMvcConfigurerconfigureMessageConverters@EnableWebMvcgetMessageConvertersWebMvcConfigurationSupportSpring中文文档

有关详细信息,请参阅 WebMvcAutoConfiguration 源代码。Spring中文文档

处理分段文件上传

Spring Boot 包含 servlet 5 API 来支持上传文件。 默认情况下,Spring Boot 将 Spring MVC 配置为每个文件的最大大小为 1MB,单个请求中的文件数据最大为 10MB。 可以使用类中公开的属性覆盖这些值、存储中间数据的位置(例如,存储到目录的位置)以及数据刷新到磁盘的阈值。 例如,如果要指定文件不受限制,请将该属性设置为 。jakarta.servlet.http.Part/tmpMultipartPropertiesspring.servlet.multipart.max-file-size-1Spring中文文档

当您希望在 Spring MVC 控制器处理程序方法中以 -annotated 参数的形式接收多部分编码文件数据时,多部分支持非常有用。@RequestParamMultipartFileSpring中文文档

有关详细信息,请参阅 MultipartAutoConfiguration 源。Spring中文文档

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

关闭 Spring MVC DispatcherServlet

默认情况下,所有内容都从应用程序的根目录提供 ()。 如果希望映射到其他路径,可以按如下方式配置一个路径:/Spring中文文档

spring.mvc.servlet.path=/mypath
spring:
  mvc:
    servlet:
      path: "/mypath"

如果您有其他 servlet,您可以声明 type or for each ,Spring Boot 会将它们透明地注册到容器中。 由于 servlet 是以这种方式注册的,因此它们可以映射到 Servlet 的子上下文,而无需调用它。@BeanServletServletRegistrationBeanDispatcherServletSpring中文文档

配置自己是不寻常的,但如果您确实需要这样做,还必须提供 of 类型以提供自定义的路径。DispatcherServlet@BeanDispatcherServletPathDispatcherServletSpring中文文档

关闭默认 MVC 配置

完全控制 MVC 配置的最简单方法是提供自己的注释。 这样做会使所有 MVC 配置都掌握在您手中。@Configuration@EnableWebMvcSpring中文文档

自定义 ViewResolver

A 是 Spring MVC 的核心组件,用于将视图名称转换为实际实现。 请注意,它们主要用于 UI 应用程序,而不是 REST 样式的服务(a 不用于呈现 )。 有很多实现可供选择,Spring 本身并没有对你应该使用哪些实现有意见。 另一方面,Spring Boot 会根据它在类路径和应用程序上下文中找到的内容为您安装一两个。 它使用它在应用程序上下文中找到的所有解析程序,依次尝试每个解析程序,直到得到结果。 如果添加自己的解析器,则必须注意添加解析器的顺序和位置。ViewResolver@ControllerViewViewResolversView@ResponseBodyViewResolverDispatcherServletSpring中文文档

WebMvcAutoConfiguration将以下内容添加到上下文中:ViewResolversSpring中文文档

  • 名为“defaultViewResolver”。 它定位可以使用 的物理资源(包括静态资源和 JSP 页面,如果使用它们的话)。 它将前缀和后缀应用于视图名称,然后在 servlet 上下文中查找具有该路径的物理资源(默认值均为空,但可以通过 和 进行外部配置访问)。 您可以通过提供相同类型的 Bean 来覆盖它。InternalResourceViewResolverDefaultServletspring.mvc.view.prefixspring.mvc.view.suffixSpring中文文档

  • 名为“beanNameViewResolver”。 这是视图解析器链的一个有用成员,可以选取与正在解析的 bean 同名的任何 bean。 没有必要覆盖或替换它。BeanNameViewResolverViewSpring中文文档

  • 当确实存在 bean 类型时,才会添加名为“viewResolver”的 bean。 这是一个复合解析器,委托给所有其他解析器,并尝试查找与客户端发送的“Accept”HTTP 标头的匹配项。 有一个关于 ContentNegotiatingViewResolver 的有用博客,您可能想学习以了解更多信息,您还可以查看源代码以获取详细信息。 您可以通过定义名为“viewResolver”的 Bean 来关闭自动配置。ContentNegotiatingViewResolverViewContentNegotiatingViewResolverSpring中文文档

  • 如果您使用 Thymeleaf,您还有一个名为“thymeleafViewResolver”的。 它通过用前缀和后缀将视图名称括起来来查找资源。 前缀是 ,后缀是 。 前缀和后缀的值分别默认为“classpath:/templates/”和“.html”。 您可以通过提供同名的 Bean 来覆盖。ThymeleafViewResolverspring.thymeleaf.prefixspring.thymeleaf.suffixThymeleafViewResolverSpring中文文档

  • 如果您使用 FreeMarker,您还有一个名为“freeMarkerViewResolver”的解析器。 它通过用前缀和后缀包围视图名称来查找加载程序路径(外部化并具有默认值“classpath:/templates/”)中的资源。 前缀外化为 ,后缀外化为 。 前缀和后缀的默认值分别为空和“.ftlh”。 您可以通过提供同名的 Bean 来覆盖。FreeMarkerViewResolverspring.freemarker.templateLoaderPathspring.freemarker.prefixspring.freemarker.suffixFreeMarkerViewResolverSpring中文文档

  • 如果你使用 Groovy 模板(实际上,如果你在你的类路径上),你也有一个名为“groovyMarkupViewResolver”的模板。 它通过用前缀和后缀(外部化为 和 )将视图名称括起来来查找加载程序路径中的资源。 前缀和后缀的默认值分别为“classpath:/templates/”和“.tpl”。 您可以通过提供同名的 Bean 来覆盖。groovy-templatesGroovyMarkupViewResolverspring.groovy.template.prefixspring.groovy.template.suffixGroovyMarkupViewResolverSpring中文文档

  • 如果您使用 Mustache,您还有一个名为“mustacheViewResolver”的。 它通过用前缀和后缀将视图名称括起来来查找资源。 前缀是 ,后缀是 。 前缀和后缀的值分别默认为“classpath:/templates/”和“.mustache”。 您可以通过提供同名的 Bean 来覆盖。MustacheViewResolverspring.mustache.prefixspring.mustache.suffixMustacheViewResolverSpring中文文档

有关详细信息,请参阅以下部分:Spring中文文档