春季MVC

春季新兵有多个首发,其中包括春季MVC。 注意,有些起始程序会依赖春季MVC,而不是直接包含。 本节将解答关于春季MVC和春季启动的常见问题。spring-doc.cadn.net.cn

编写一个 JSON REST 服务

任何Spring@RestController在 Spring Boot 应用中,只要 Jackson 3 在类路径上,默认应呈现 JSON 响应,如下示例所示:spring-doc.cadn.net.cn

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()
	}

}

只要我的事可以通过Jackson 3序列化(对普通POJO或Groovy对象成立),则localhost:8080/thing默认提供 JSON 表示。 请注意,在浏览器中,有时你可能会看到XML响应,因为浏览器倾向于发送更倾向于XML的accept头。spring-doc.cadn.net.cn

编写XML REST Service。

如果你有 Jackson XML 扩展 (Jackson-Dataformat-XML你可以用它来渲染XML响应。 我们之前用来做 JSON 的例子是可行的。 要使用 Jackson XML 渲染器,请在您的项目中添加以下依赖:spring-doc.cadn.net.cn

<dependency>
	<groupId>tools.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-xml</artifactId>
</dependency>

如果没有Jackson的XML扩展而JAXB可用,则可以渲染XML并附加要求我的事注释为@XmlRootElement如下例所示:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

<dependency>
	<groupId>org.glassfish.jaxb</groupId>
	<artifactId>jaxb-runtime</artifactId>
</dependency>
要让服务器渲染 XML 而不是 JSON,你可能需要发送接受:文本/XML头部(或使用浏览器)。

自定义Jackson JsonMapper

你可以配置JsonMapper利用环境。 Jackson 提供了一套广泛的开/关功能,可用于配置其处理的各个方面。 这些特征在多个枚举(Jackson文档中)描述,这些枚举映射到环境中的属性:spring-doc.cadn.net.cn

枚举 属性

日期时间功能spring-doc.cadn.net.cn

Spring.jackson.datatype.datetime.<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

枚举功能spring-doc.cadn.net.cn

spring.jackson.datatype.enum.<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

JsonNodeFeaturespring-doc.cadn.net.cn

spring.jackson.datatype.json节点.<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

JsonInclude.Includespring-doc.cadn.net.cn

Spring.Jackson.default-property-inclusionspring-doc.cadn.net.cn

总是,non_null,non_absent,non_default,non_emptyspring-doc.cadn.net.cn

反序列化功能spring-doc.cadn.net.cn

Spring.Jackson.deserialization.<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

JsonReadFeaturespring-doc.cadn.net.cn

spring.jackson.json.read..<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

JsonWriteFeaturespring-doc.cadn.net.cn

spring.jackson.json.write.<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

Mapper特色spring-doc.cadn.net.cn

春季。Jackson。地图师<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

序列化功能spring-doc.cadn.net.cn

spring.jackson.serialization.<feature_name>spring-doc.cadn.net.cn

true,falsespring-doc.cadn.net.cn

例如,要启用漂亮印刷,设置spring.jackson.serialization.indent_output=真. 注意,由于使用了松弛装订,以下情况indent_output不必与对应的枚举常数相匹配,即INDENT_OUTPUT.spring-doc.cadn.net.cn

这种基于环境的配置应用到自动配置架构工人Bean,适用于使用建构器创建的所有映射器,包括自动配置的JsonMapper豆。spring-doc.cadn.net.cn

为了简化迁移,之前使用 Jackson 2 的应用程序时,自动配置JsonMapper可以配置为尽可能接近 Spring Boot 用于 Jackson 2 的默认设置。要启用这些默认设置spring.jackson.use-jackson2-defaultstrue.spring-doc.cadn.net.cn

背景架构工人可以由一个或多个自定义JsonMapperBuilderCustomizer豆。 这样的定制豆可以被订购(Boot 自己的定制器订单为 0),允许在自定义前后都进行额外的定制。spring-doc.cadn.net.cn

任何类型的豆子Jackson模块自动注册架构工人和 都应用于任意JsonMapper它创造的实例。 这为你在应用中添加新功能时,提供了应用范围内的自定义模块贡献机制。spring-doc.cadn.net.cn

任何参与 Java 的模块ServiceLoader机制默认被找到并添加到自动配置中架构工人.要禁用此行为,设spring.jackson.find-and-add-modulesfalse.spring-doc.cadn.net.cn

如果你想替换默认的JsonMapper完全,或定义@Bean或者,如果你更喜欢基于建造者的方法,也可以定义一个架构工人 @Bean. 在定义JsonMapperBean,标记为@Primary推荐作为自动配置JsonMapper它将取代的@Primary. 请注意,无论哪种情况,这样做都会禁用所有自动配置JsonMapper.spring-doc.cadn.net.cn

如果你提供任何@Bean的类型JacksonJsonHttpMessageConverter它们替换了MVC配置中的默认值。 还有一种方便的豆子HttpMessage转换器是提供的(如果你使用默认的MVC配置,则总是可用)。 它有一些有用的方法来访问默认和用户增强的消息转换器。spring-doc.cadn.net.cn

请参见“自定义@ResponseBody渲染”部分和WebMvcAutoConfiguration更多细节请查看源代码。spring-doc.cadn.net.cn

自定义@ResponseBody渲染

Spring用途HttpMessage转换器渲染@ResponseBody(或来自以下回应@RestController). 你可以通过在 Spring Boot 环境中添加相应类型的豆子来贡献额外的转换器。 如果你添加的豆子类型本来就会被默认包含(比如JacksonJsonHttpMessageConverter用于 JSON 转换),它取代了默认值。 一种方便的类型HttpMessage转换器如果您使用默认的 MVC 配置,则是提供的,并且始终可用。 它有一些有用的方法来访问默认和用户增强的消息转换器(例如,如果你想手动注入自定义文件,它会很有用Rest模板).spring-doc.cadn.net.cn

就像普通的MVC使用一样,任何WebMvcConfigurer你提供的豆子也可以通过覆盖configureMessageConverters方法。 然而,与普通MVC不同的是,你只能提供所需的额外转换器(因为Spring Boot也采用相同的机制来贡献其默认转换器)。 最后,如果你选择退出默认的 Spring Boot MVC 配置,提供自己的配置@EnableWebMvc配置时,你可以完全控制并手动完成所有作,方法是用getMessageConvertersWebMvc配置支持.spring-doc.cadn.net.cn

参见WebMvcAutoConfiguration更多细节请查看源代码。spring-doc.cadn.net.cn

处理多部分文件上传

Spring靴拥抱了5号球部分支持上传文件的API。 默认情况下,Spring Boot 配置 Spring MVC 每个文件最大大小为 1MB,单次请求中最多为 10MB 文件数据。 你可以覆盖这些值,即中间数据存储的位置(例如,存储在/tmp目录),以及利用暴露于磁盘的属性后,数据被刷新到磁盘的阈值多部分属性类。 例如,如果你想指定文件为无限,可以设置spring.servlet.multipart.max-文件大小属性到-1.spring-doc.cadn.net.cn

当你想接收多部分编码文件数据时,多部分支持很有帮助@RequestParam- 类型为 的注释参数多部分文件在 Spring MVC 控制器处理器方法中。spring-doc.cadn.net.cn

建议使用容器内置的多部分上传支持,而非引入如Apache Commons文件上传等额外依赖。

关闭SpringMVC调度器Servlet。

默认情况下,所有内容均由应用根节点()提供。 如果你更想映射到不同的路径,可以配置如下:/spring-doc.cadn.net.cn

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

如果你有额外的 servlet,可以声明 a@Bean类型servletServletRegistrationBean对于每个,Spring Boot 会透明地向容器注册它们。 也可以使用@ServletRegistration作为基于注释的替代方案ServletRegistrationBean. 由于 servlet 是以这种方式注册的,它们可以映射到调度器服务但没有召唤它。spring-doc.cadn.net.cn

配置DispatcherServletPath你自己很特别,但如果你真的需要,那@Bean类型DispatcherServletPath也必须提供,以提供你定制的路径调度器服务.spring-doc.cadn.net.cn

关闭默认的MVC配置

完全控制MVC配置最简单的方法是提供自己的配置@Configuration其中@EnableWebMvc注解。 这样做后,所有的MVC配置都交给你了。spring-doc.cadn.net.cn

自定义视图解析器

一个ViewResolver是 Spring MVC 的核心组件,用于转换视图名称@Controller到实际视图实现。 注意,视图解析器主要用于 UI 应用,而非 REST 风格的服务(a视图不用于渲染@ResponseBody). 有许多实现方式ViewResolver可以选择,而Spring本身并没有明确决定你应该用哪些。 而 Spring Boot 则会根据类路径和应用上下文为你安装一两个。 这调度器服务使用应用上下文中找到的所有解析器,依次尝试每个解析器,直到得到结果。 如果你自己添加解析器,必须清楚排序顺序和你的解析器被添加的位置。spring-doc.cadn.net.cn

WebMvcAutoConfiguration补充如下内容ViewResolver补充一下你的背景:spring-doc.cadn.net.cn

  • InternalResourceViewResolver命名为“defaultViewResolver”。 该方法通过以下方式来定位可渲染的物理资源DefaultServlet(包括静态资源和JSP页面,如果你用的话)。 它在视图名称前加上前缀和后缀,然后在servlet上下文中寻找带有该路径的物理资源(默认值均为空,但外部配置可通过访问spring.mvc.view.prefixspring.mvc.view.suffix). 你可以通过提供同类型的豆子来覆盖它。spring-doc.cadn.net.cn

  • 一个BeanNameViewResolver命名为“beanNameViewResolver”。 这是视图解析链中有用的成员,可以拾取与视图正在解决。 不需要覆盖或替换它。spring-doc.cadn.net.cn

  • 一个内容协商视图解析器只有当存在 的 be豆时才会添加名为“viewResolver”的视图目前。 这是一个复合解析器,委派给所有其他解析器,并尝试寻找与客户端发送的“Accept”HTTP头匹配的解析器。 有一个有用的博客介绍 内容协商视图解析器你可能想研究一下,了解更多,也可以查看源代码以获取细节。 你可以关闭自动配置内容协商视图解析器通过定义一个名为“viewResolver”的豆子。spring-doc.cadn.net.cn

  • 如果你用百里香叶,你还有一个ThymeleafViewResolver命名为“thymeleafViewResolver”。 它通过在视图名称周围加上前缀和后缀来寻找资源。 前缀为春季.百里米叶.前缀,后缀为Spring。百里香叶。后缀. 前缀和后缀的值默认为“classpath:/templates/”和“.html”。 你可以覆盖ThymeleafViewResolver通过提供同名豆子。spring-doc.cadn.net.cn

  • 如果你使用FreeMarker,你还有一个FreeMarkerViewResolver命名为“freeMarkerViewResolver”。 它在加载器路径中寻找资源(该路径外部化为spring.freemarker.templateLoaderPath并且默认值为“classpath:/templates/'),通过在视图名称周围加上前缀和后缀。 前缀外部化为Spring.freemarker.prefix,后缀外部化为spring.freemarker.suffix. 前缀和后缀的默认值分别为空和“.ftlh”。 你可以覆盖FreeMarkerViewResolver通过提供同名豆子。 FreeMarker 变量可以通过定义 类型的 bean 来进行自定义FreeMarkerVariablesCustomizer.spring-doc.cadn.net.cn

  • 如果你用Groovy模板(实际上,如果groovy模板在你的阶级路径上),你还有一个GroovyMarkupViewResolver命名为“groovyMarkupViewResolver”。 它通过在视图名称周围加上前缀和后缀(外部化为Spring.groovy.template.prefixspring.groovy.template.suffix). 前缀和后缀的默认值分别是“classpath:/templates/”和“.tpl”。 你可以覆盖GroovyMarkupViewResolver通过提供同名豆子。spring-doc.cadn.net.cn

  • 如果你用Mustache,你还有一个MustacheViewResolver名为“mustacheViewResolver”。 它通过在视图名称周围加上前缀和后缀来寻找资源。 前缀为Spring。胡须。前缀,后缀为Spring、胡须、后缀. 前缀和后缀的值默认为 'classpath:/templates/' 和 '.mustache'。 你可以覆盖MustacheViewResolver通过提供同名豆子。spring-doc.cadn.net.cn

更多细节请参见以下章节:spring-doc.cadn.net.cn

自定义“白标”错误页面

Spring Boot 会安装一个“白标”错误页面,如果你遇到服务器错误,浏览器客户端会看到它(机器客户端使用 JSON 和其他媒体类型时,应该会看到带有正确错误代码的合理响应)。spring-doc.cadn.net.cn

设置spring.web.error.whitelabel.enabledfalse关闭默认错误页面。 这样做会恢复你所使用的 servlet 容器的默认值。 注意 Spring Boot 仍然会尝试解决错误视图,所以你最好添加自己的错误页面,而不是完全禁用它。

是否用自己的模板覆盖错误页面取决于你使用的模板技术。 例如,如果你使用百里香叶,你可以添加一个error.html模板。 如果你使用FreeMarker,可以添加一个错误。超速模板。 一般来说,你需要一个视图该 的结算为错误或者@Controller该处理/错误路径。 除非你更换了部分默认配置,否则你应该能找到BeanNameViewResolver在你的应用上下文,所以@Bean错误这也是一种方式。 看ErrorMvcAutoConfiguration更多选择。spring-doc.cadn.net.cn

另请参阅关于如何在 servlet 容器中注册处理程序的详细内容,参见错误处理部分。spring-doc.cadn.net.cn