春季MVC
春季新兵有多个首发,其中包括春季MVC。 注意,有些起始程序会依赖春季MVC,而不是直接包含。 本节将解答关于春季MVC和春季启动的常见问题。
编写一个 JSON REST 服务
任何Spring@RestController在 Spring Boot 应用中,只要 Jackson 3 在类路径上,默认应呈现 JSON 响应,如下示例所示:
-
Java
-
Kotlin
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头。
编写XML REST Service。
如果你有 Jackson XML 扩展 (Jackson-Dataformat-XML你可以用它来渲染XML响应。
我们之前用来做 JSON 的例子是可行的。
要使用 Jackson XML 渲染器,请在您的项目中添加以下依赖:
<dependency>
<groupId>tools.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
如果没有Jackson的XML扩展而JAXB可用,则可以渲染XML并附加要求我的事注释为@XmlRootElement如下例所示:
-
Java
-
Kotlin
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库是你项目的一部分,例如添加:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
要让服务器渲染 XML 而不是 JSON,你可能需要发送接受:文本/XML头部(或使用浏览器)。 |
自定义Jackson JsonMapper
你可以配置JsonMapper利用环境。
Jackson 提供了一套广泛的开/关功能,可用于配置其处理的各个方面。
这些特征在多个枚举(Jackson文档中)描述,这些枚举映射到环境中的属性:
| 枚举 | 属性 | 值 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
例如,要启用漂亮印刷,设置spring.jackson.serialization.indent_output=真.
注意,由于使用了松弛装订,以下情况indent_output不必与对应的枚举常数相匹配,即INDENT_OUTPUT.
这种基于环境的配置应用到自动配置架构工人Bean,适用于使用建构器创建的所有映射器,包括自动配置的JsonMapper豆。
为了简化迁移,之前使用 Jackson 2 的应用程序时,自动配置JsonMapper可以配置为尽可能接近 Spring Boot 用于 Jackson 2 的默认设置。要启用这些默认设置spring.jackson.use-jackson2-defaults自true.
背景架构工人可以由一个或多个自定义JsonMapperBuilderCustomizer豆。
这样的定制豆可以被订购(Boot 自己的定制器订单为 0),允许在自定义前后都进行额外的定制。
任何类型的豆子Jackson模块自动注册架构工人和 都应用于任意JsonMapper它创造的实例。
这为你在应用中添加新功能时,提供了应用范围内的自定义模块贡献机制。
任何参与 Java 的模块ServiceLoader机制默认被找到并添加到自动配置中架构工人.要禁用此行为,设spring.jackson.find-and-add-modules自false.
如果你想替换默认的JsonMapper完全,或定义@Bean或者,如果你更喜欢基于建造者的方法,也可以定义一个架构工人 @Bean.
在定义JsonMapperBean,标记为@Primary推荐作为自动配置JsonMapper它将取代的@Primary.
请注意,无论哪种情况,这样做都会禁用所有自动配置JsonMapper.
如果你提供任何@Bean的类型JacksonJsonHttpMessageConverter它们替换了MVC配置中的默认值。
还有一种方便的豆子HttpMessage转换器是提供的(如果你使用默认的MVC配置,则总是可用)。
它有一些有用的方法来访问默认和用户增强的消息转换器。
请参见“自定义@ResponseBody渲染”部分和WebMvcAutoConfiguration更多细节请查看源代码。
自定义@ResponseBody渲染
Spring用途HttpMessage转换器渲染@ResponseBody(或来自以下回应@RestController).
你可以通过在 Spring Boot 环境中添加相应类型的豆子来贡献额外的转换器。
如果你添加的豆子类型本来就会被默认包含(比如JacksonJsonHttpMessageConverter用于 JSON 转换),它取代了默认值。
一种方便的类型HttpMessage转换器如果您使用默认的 MVC 配置,则是提供的,并且始终可用。
它有一些有用的方法来访问默认和用户增强的消息转换器(例如,如果你想手动注入自定义文件,它会很有用Rest模板).
就像普通的MVC使用一样,任何WebMvcConfigurer你提供的豆子也可以通过覆盖configureMessageConverters方法。
然而,与普通MVC不同的是,你只能提供所需的额外转换器(因为Spring Boot也采用相同的机制来贡献其默认转换器)。
最后,如果你选择退出默认的 Spring Boot MVC 配置,提供自己的配置@EnableWebMvc配置时,你可以完全控制并手动完成所有作,方法是用getMessageConverters从WebMvc配置支持.
参见WebMvcAutoConfiguration更多细节请查看源代码。
处理多部分文件上传
Spring靴拥抱了5号球部分支持上传文件的API。
默认情况下,Spring Boot 配置 Spring MVC 每个文件最大大小为 1MB,单次请求中最多为 10MB 文件数据。
你可以覆盖这些值,即中间数据存储的位置(例如,存储在/tmp目录),以及利用暴露于磁盘的属性后,数据被刷新到磁盘的阈值多部分属性类。
例如,如果你想指定文件为无限,可以设置spring.servlet.multipart.max-文件大小属性到-1.
当你想接收多部分编码文件数据时,多部分支持很有帮助@RequestParam- 类型为 的注释参数多部分文件在 Spring MVC 控制器处理器方法中。
参见MultipartAutoConfiguration更多信息来源。
| 建议使用容器内置的多部分上传支持,而非引入如Apache Commons文件上传等额外依赖。 |
关闭SpringMVC调度器Servlet。
默认情况下,所有内容均由应用根节点()提供。
如果你更想映射到不同的路径,可以配置如下:/
-
Properties
-
YAML
spring.mvc.servlet.path=/mypath
spring:
mvc:
servlet:
path: "/mypath"
如果你有额外的 servlet,可以声明 a@Bean类型servlet或ServletRegistrationBean对于每个,Spring Boot 会透明地向容器注册它们。
也可以使用@ServletRegistration作为基于注释的替代方案ServletRegistrationBean.
由于 servlet 是以这种方式注册的,它们可以映射到调度器服务但没有召唤它。
配置DispatcherServletPath你自己很特别,但如果你真的需要,那@Bean类型DispatcherServletPath也必须提供,以提供你定制的路径调度器服务.
关闭默认的MVC配置
完全控制MVC配置最简单的方法是提供自己的配置@Configuration其中@EnableWebMvc注解。
这样做后,所有的MVC配置都交给你了。
自定义视图解析器
一个ViewResolver是 Spring MVC 的核心组件,用于转换视图名称@Controller到实际视图实现。
注意,视图解析器主要用于 UI 应用,而非 REST 风格的服务(a视图不用于渲染@ResponseBody).
有许多实现方式ViewResolver可以选择,而Spring本身并没有明确决定你应该用哪些。
而 Spring Boot 则会根据类路径和应用上下文为你安装一两个。
这调度器服务使用应用上下文中找到的所有解析器,依次尝试每个解析器,直到得到结果。
如果你自己添加解析器,必须清楚排序顺序和你的解析器被添加的位置。
WebMvcAutoConfiguration补充如下内容ViewResolver补充一下你的背景:
-
一
InternalResourceViewResolver命名为“defaultViewResolver”。 该方法通过以下方式来定位可渲染的物理资源DefaultServlet(包括静态资源和JSP页面,如果你用的话)。 它在视图名称前加上前缀和后缀,然后在servlet上下文中寻找带有该路径的物理资源(默认值均为空,但外部配置可通过访问spring.mvc.view.prefix和spring.mvc.view.suffix). 你可以通过提供同类型的豆子来覆盖它。 -
一个
BeanNameViewResolver命名为“beanNameViewResolver”。 这是视图解析链中有用的成员,可以拾取与视图正在解决。 不需要覆盖或替换它。 -
一个
内容协商视图解析器只有当存在 的 be豆时才会添加名为“viewResolver”的视图目前。 这是一个复合解析器,委派给所有其他解析器,并尝试寻找与客户端发送的“Accept”HTTP头匹配的解析器。 有一个有用的博客介绍内容协商视图解析器你可能想研究一下,了解更多,也可以查看源代码以获取细节。 你可以关闭自动配置内容协商视图解析器通过定义一个名为“viewResolver”的豆子。 -
如果你用百里香叶,你还有一个
ThymeleafViewResolver命名为“thymeleafViewResolver”。 它通过在视图名称周围加上前缀和后缀来寻找资源。 前缀为春季.百里米叶.前缀,后缀为Spring。百里香叶。后缀. 前缀和后缀的值默认为“classpath:/templates/”和“.html”。 你可以覆盖ThymeleafViewResolver通过提供同名豆子。 -
如果你使用FreeMarker,你还有一个
FreeMarkerViewResolver命名为“freeMarkerViewResolver”。 它在加载器路径中寻找资源(该路径外部化为spring.freemarker.templateLoaderPath并且默认值为“classpath:/templates/'),通过在视图名称周围加上前缀和后缀。 前缀外部化为Spring.freemarker.prefix,后缀外部化为spring.freemarker.suffix. 前缀和后缀的默认值分别为空和“.ftlh”。 你可以覆盖FreeMarkerViewResolver通过提供同名豆子。 FreeMarker 变量可以通过定义 类型的 bean 来进行自定义FreeMarkerVariablesCustomizer. -
如果你用Groovy模板(实际上,如果
groovy模板在你的阶级路径上),你还有一个GroovyMarkupViewResolver命名为“groovyMarkupViewResolver”。 它通过在视图名称周围加上前缀和后缀(外部化为Spring.groovy.template.prefix和spring.groovy.template.suffix). 前缀和后缀的默认值分别是“classpath:/templates/”和“.tpl”。 你可以覆盖GroovyMarkupViewResolver通过提供同名豆子。 -
如果你用Mustache,你还有一个
MustacheViewResolver名为“mustacheViewResolver”。 它通过在视图名称周围加上前缀和后缀来寻找资源。 前缀为Spring。胡须。前缀,后缀为Spring、胡须、后缀. 前缀和后缀的值默认为 'classpath:/templates/' 和 '.mustache'。 你可以覆盖MustacheViewResolver通过提供同名豆子。
更多细节请参见以下章节:
自定义“白标”错误页面
Spring Boot 会安装一个“白标”错误页面,如果你遇到服务器错误,浏览器客户端会看到它(机器客户端使用 JSON 和其他媒体类型时,应该会看到带有正确错误代码的合理响应)。
设置spring.web.error.whitelabel.enabled自false关闭默认错误页面。
这样做会恢复你所使用的 servlet 容器的默认值。
注意 Spring Boot 仍然会尝试解决错误视图,所以你最好添加自己的错误页面,而不是完全禁用它。 |
是否用自己的模板覆盖错误页面取决于你使用的模板技术。
例如,如果你使用百里香叶,你可以添加一个error.html模板。
如果你使用FreeMarker,可以添加一个错误。超速模板。
一般来说,你需要一个视图该 的结算为错误或者@Controller该处理/错误路径。
除非你更换了部分默认配置,否则你应该能找到BeanNameViewResolver在你的应用上下文,所以@Bean叫错误这也是一种方式。
看ErrorMvcAutoConfiguration更多选择。
另请参阅关于如何在 servlet 容器中注册处理程序的详细内容,参见错误处理部分。