Spring MVC 自动配置
Spring Boot 提供了适用于大多数 Spring MVC 应用的自动配置
自动配置在 Spring 默认功能上添加了以下功能:
- 引入
ContentNegotiatingViewResolver
和BeanNameViewResolver
bean。 - 支持服务静态资源,包括对 WebJar 的支持。
- 自动注册
Converter
、GenericConverter
和Formatter
bean。 - 支持
HttpMessageConverter
。 - 自动注册
MessageCodesResolver
。 - 支持静态 index.html。
- 支持自定义 Favicon 。
- 自动使用
ConfigurableWebBindingInitializer
bean。
HttpMessageConverters
Spring MVC 使用 HttpMessageConverter
接口来转换 HTTP 的请求和响应
自定义 JSON Serializer 和 Deserializer
自定义序列化器(serializer)的做法通常是通过一个模块来注册 Jackson, 然而 Spring Boot 提供了一个备选的 @JsonComponent
注解,它可以更加容易地直接注册 Spring Bean。
MessageCodesResolver
Spring MVC 有一个从绑定错误中生成错误码的策略,用于渲染错误信息:MessageCodesResolver
。如果设置了 spring.mvc.message-codes-resolver.format
属性值为 PREFIX_ERROR_CODE
或 POSTFIX_ERROR_CODE
,Spring Boot 将为你创建该策略。
静态内容
默认情况下,Spring Boot 将在 classpath 或者 ServletContext
根目录下从名为 /static
(/public
、/resources
或 /META-INF/resources
)目录中服务静态内容。它使用了 Spring MVC 的 ResourceHttpRequestHandler
,因此您可以通过添加自己的 WebMvcConfigurerAdapter
并重写 addResourceHandlers
方法来修改此行为。
默认情况下,资源被映射到 /**
,但可以通过 spring.mvc.static-path-pattern
属性调整。比如,将所有资源重定位到 /resources/**
:
spring.mvc.static-path-pattern=/resources/**
如果您的应用程序要包成 jar,请不要使用
src/main/webapp
目录。虽然此目录是一个通用标准,但它只适用于 war 打包,如果生成的是一个 jar,它将被绝大多数的构建工具所忽略。
欢迎页面
Spring Boot 支持静态和模板化的欢迎页面。它首先在配置的静态内容位置中查找
index.html
文件。如果找不到,则查找 index
模板。
自定义 Favicon
Spring Boot 在配置的静态内容位置和根 classpath 中查找
favicon.ico
(按顺序)
路径匹配与内容协商
Spring MVC 可以通过查看请求路径并将其与应用程序中定义的映射相匹配,将传入的 HTTP 请求映射到处理程序。
Spring Boot 默认选择禁用后缀模式匹配,这意味着像
"GET /projects/spring-boot.json"
这样的请求将不会与 @GetMapping("/projects/spring-boot")
映射匹配。
模板引擎
Spring Boot 包含了以下的模板引擎的自动配置支持:
错误处理
可以定义一个带有 @ControllerAdvice
注解的类来自定义为特定控制器或异常类型返回的 JSON 文档:
@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}
如果同包下定义的控制器 AcmeController
抛出了 YourException
,则将使用 CustomerErrorType
类型的 POJO 来代替 ErrorAttributes
做 JSON 呈现
自定义错误页面
想在自定义的 HTML 错误页面上显示给定的状态码,请将文件添加到 /error
文件夹中。错误页面可以是静态 HTML(添加在任意静态资源文件夹下) 或者使用模板构建。文件的名称应该是确切的状态码或者一个序列掩码。
要将 404
映射到一个静态 HTML 文件,文件夹结构可以如下
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
映射到 Spring MVC 之外的错误页面
对于不使用 Spring MVC 的应用程序,您可以使用 ErrorPageRegistrar
接口来直接注册 ErrorPages
。抽象部分直接与底层的内嵌 servlet 容器一起工作,即使没有 Spring MVC DispatcherServlet
也能使用。
@Bean
public ErrorPageRegistrar errorPageRegistrar(){
return new MyErrorPageRegistrar();
}
// ...
private static class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
}
}
CORS 支持
跨域资源共享(Cross-origin resource sharing,CORS)是大多数浏览器实现的一个 W3C 规范
在 Spring Boot 应用程序中使用 @CrossOrigin
注解配置控制器方法启用 CORS。还可以通过注册一个 WebMvcConfigurer bean 并自定义 addCorsMappings(CorsRegistry)
方法来定义全局 CORS 配置:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
来源:oschina
链接:https://my.oschina.net/u/4038596/blog/3211664