SpringBoot对SpringMVC的自动配置,你知道多少?( 二 )

ApplicationContext中的所有@JsonComponent bean都会自动注册到Jackson中 。因为@JsonComponent是用@Component进行元注释的,所以应用了通常的组件扫描规则 。
MessageCodesResolverSpring MVC有一个生成错误代码的策略,用于从绑定错误中呈现错误消息:MessageCodesResolver 。如果你设置
spring.mvc.message-codes-resolver-format属性PREFIX_ERROR_CODE或POSTFIX_ERROR_CODE,则spring Boot会为你创建一个属性 。
静态内容默认情况下,Spring Boot从类路径中名为/static(或/public或/resources或/META-INF/resources)的目录或ServletContext的根目录提供静态内容 。它使用Spring MVC中的
ResourceHttpRequestHandler,因此您可以通过添加自己的WebMvcConfigurer并重写addResourceHandlers方法来修改该行为 。
在独立的web应用程序中,不会启用容器中的默认servlet 。可以使用
server.servlet.register-default-servlet属性启用它 。
默认的servlet充当后备,如果Spring决定不处理ServletContext的根,则从ServletContext提供内容 。大多数情况下,这不会发生(除非您修改默认的MVC配置),因为Spring总是可以通过DispatcherServlet处理请求 。
默认情况下,资源映射在/**上,但您可以使用
spring.mvc.static-path-pattern属性对其进行调优 。例如,将所有资源重新定位到/resources/**可以通过以下方式实现:
spring:mvc:static-path-pattern: "/resources/**"你还可以使用spring.web.resources自定义静态资源位置 。static-locations属性(用目录位置列表替换默认值) 。根servlet上下文路径“/”也会自动添加为位置 。
除了前面提到的“标准”静态资源位置之外,还有一个针对Webjars内容的特殊情况 。任何路径在/webjars/**中的资源,如果它们被打包成webjars格式,就会从jar文件中提供 。
Spring Boot还支持Spring MVC提供的高级资源处理功能,允许使用缓存破坏静态资源或为Webjars使用版本不可知的URL等用例 。
要为Webjars使用与版本无关的URL,请添加Webjars定位器核心依赖项 。然后声明您的Webjar 。以jQuery为例,添加“
/webjars/jQuery/jQuery.min.js”会导致“/Webjar/jQuery/x.y.z/jQuery.min.js”,其中x.y.z是Webjar版本 。
要使用缓存破坏,以下配置为所有静态资源配置缓存破坏解决方案,从而有效地在URL中添加内容哈希,如<link href=https://www.isolves.com/it/cxkf/kj/2023-03-23/“
/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css”/>:?
spring:web:resources:chain:strategy:content:enabled: truepaths: "/**"路径匹配与内容协商Spring MVC可以通过查看请求路径并将其与应用程序中定义的映射(例如,Controller方法上的@GetMapping注释)进行匹配,将传入的HTTP请求映射到处理程序 。
Spring Boot默认选择禁用后缀模式匹配,这意味着像"GET/projects/Spring Boot.json"这样的请求将不会与@GetMapping("/projects/Spring Boot")映射匹配 。这被认为是Spring MVC应用程序的最佳实践 。这个功能在过去主要适用于没有发送正确的“Accept”请求头的HTTP客户端;我们需要确保向客户端发送正确的内容类型 。如今,内容协商更加可靠 。
还有其他方法可以处理那些不一致地发送正确的"Accept"请求头的HTTP客户端 。我们可以使用查询参数来确保像"GET/projects/spring-boot?format=json"这样的请求将被映射到@GetMapping("/projects/spring-boot"),而不是使用后缀匹配:
spring:mvc:contentnegotiation:favor-parameter: true或者自定义参数名称:
spring:mvc:contentnegotiation:favor-parameter: trueparameter-name: "myparam"大多数标准media type都支持开箱即用,但你也可以定义新的:
spring:mvc:contentnegotiation:media-types:markdown: "text/markdown"后缀模式匹配已弃用,并将在将来的版本中删除 。如果你理解注意事项,并且仍然希望你的应用程序使用后缀模式匹配,则需要以下配置:
spring:mvc:contentnegotiation:favor-path-extension: truepathmatch:use-suffix-pattern: true ConfigurableWebBindingInitializerSpring MVC使用WebBindingInitializer为特定请求初始化WebDataBinder 。如果你创建自己的ConfigurationWebBindingInitializer@Bean,则Spring Boot会自动配置Spring MVC以使用它 。
错误处理默认情况下,Spring Boot提供了一个/error映射,以合理的方式处理所有错误,并且它在servlet容器中注册为“全局”错误页面 。对于机器客户端,它会生成一个JSON响应,其中包含错误、HTTP状态和异常消息的详细信息 。对于浏览器客户端,有一个“白标签”错误视图,它以HTML格式呈现相同的数据(要自定义它,请添加一个解决错误的视图) 。


推荐阅读