Spring Boot中包含Spring MVC的啟動器
Spring MVC
Spring Boot有許多包含Spring MVC的啟動器。請注意,一些啟動器包含對Spring MVC的依賴,而不是直接包含它。本節回答有關Spring MVC和Spring Boot的常見問題。摘譯自官方文件
編寫JSON REST服務
@RestController
只要Jackson2在類路徑中,Spring Boot應用程式中的任何Spring 都應預設呈現JSON響應,如以下示例所示:
@RestController public class MyController { @RequestMapping("/thing") public MyThing thing() { return new MyThing(); } }
只要MyThing
可以通過Jackson2序列化(對於普通的POJO或Groovy物件都是如此),則localhost:8080/thing
預設為它提供JSON表示。請注意,在瀏覽器中,您有時可能會看到XML響應,因為瀏覽器傾向於傳送更喜歡XML的接受標頭。
編寫XML REST服務
如果jackson-dataformat-xml
在類路徑上有Jackson XML擴充套件(),則可以使用它來呈現XML響應。我們用於JSON的前一個示例可以使用。要使用Jackson XML渲染器,請將以下依賴項新增到專案中:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
您可能還想在Woodstox上新增依賴項。它比JDK提供的預設StAX實現更快,並且還增加了漂亮的列印支援和改進的名稱空間處理。以下清單顯示瞭如何在Woodstox中包含依賴 項:
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
</dependency>
如果Jackson的XML擴充套件不可用,則使用JAXB(預設情況下在JDK中提供),並附加要求MyThing
@XmlRootElement
,如以下示例所示:
@XmlRootElement
public class MyThing {
private String name;
// .. getters and setters
}
要使伺服器呈現XML而不是JSON,您可能必須傳送 Accept: text/xml
標頭(或使用瀏覽器)。
自定義Jackson ObjectMapper
Spring MVC(客戶端和伺服器端)用於HttpMessageConverters
在HTTP交換中協商內容轉換。如果Jackson在類路徑上,您已經獲得了提供的預設轉換器Jackson2ObjectMapperBuilder
,其中一個例項是為您自動配置的。
該ObjectMapper
(或XmlMapper
為傑克遜XML轉換器)例項(預設建立)具有以下定義的屬性:
MapperFeature.DEFAULT_VIEW_INCLUSION
被禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
被禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
被禁用
Spring Boot還具有一些功能,可以更輕鬆地自定義此行為。
您可以使用環境配置ObjectMapper
和XmlMapper
例項。Jackson提供了一套廣泛的簡單開/關功能,可用於配置其處理的各個方面。這些功能在六個enum(在Jackson中)中描述,它們對映到環境中的屬性:
列舉 | 屬性 | 值 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
例如,要啟用漂亮列印,請設定spring.jackson.serialization.indent_output=true
。需要注意的是,由於使用了鬆弛繫結,因此indent_output
不必匹配相應列舉常量的情況,即INDENT_OUTPUT
。
此基於環境的配置應用於自動配置的 Jackson2ObjectMapperBuilder
bean,並應用於使用構建器建立的任何對映器,包括自動配置的ObjectMapper
bean。
上下文Jackson2ObjectMapperBuilder
可以由一個或多個Jackson2ObjectMapperBuilderCustomizer
bean 自定義 。可以訂購這樣的定製器bean(Boot自己的定製器的順序為0),允許在Boot定製之前和之後應用其他定製。
任何型別的bean都會com.fasterxml.jackson.databind.Module
自動註冊自動配置Jackson2ObjectMapperBuilder
,並應用於ObjectMapper
它建立的任何例項。這為您在應用程式中新增新功能時提供了一種全域性機制,用於提供自定義模組。
如果要ObjectMapper
完全替換預設值,請定義@Bean
該型別的一個並將其標記為,@Primary
或者,如果您更喜歡基於構建器的方法,請定義一個Jackson2ObjectMapperBuilder
@Bean
。請注意,在任何一種情況下,這樣做都會禁用所有的自動配置ObjectMapper
。
如果提供任何@Beans
型別MappingJackson2HttpMessageConverter
,則它們將替換MVC配置中的預設值。此外,HttpMessageConverters
還提供了型別的便利bean (如果使用預設的MVC配置,則始終可用)。它有一些有用的方法來訪問預設和使用者增強的訊息轉換器。
有關詳細資訊,請參閱“ 第79.4節 ” ,“自定義@ResponseBody渲染 ”部分和 WebMvcAutoConfiguration
原始碼。
自定義@ResponseBody渲染
Spring用於HttpMessageConverters
渲染@ResponseBody
(或響應 @RestController
)。您可以通過在Spring Boot上下文中新增適當型別的bean來提供其他轉換器。如果您新增的bean是預設包含的型別(例如MappingJackson2HttpMessageConverter
JSON轉換),則它將替換預設值。HttpMessageConverters
提供了型別的便利bean, 如果使用預設的MVC配置,它總是可用的。它有一些有用的方法來訪問預設和使用者增強的訊息轉換器(例如,如果要手動將它們注入自定義,它可能很有用RestTemplate
)。
與正常的MVC使用情況一樣,WebMvcConfigurer
您提供的任何bean也可以通過覆蓋該configureMessageConverters
方法來提供轉換器。但是,與普通MVC不同,您只能提供所需的其他轉換器(因為Spring Boot使用相同的機制來提供其預設值)。最後,如果您通過提供自己的@EnableWebMvc
配置選擇退出Spring Boot預設MVC 配置,則可以完全控制並使用getMessageConverters
from 手動完成所有操作 WebMvcConfigurationSupport
。
有關WebMvcAutoConfiguration
更多詳細資訊,請參閱 原始碼。
處理多部分檔案上載
Spring Boot包含Servlet 3 javax.servlet.http.Part
API以支援上傳檔案。預設情況下,Spring Boot配置Spring MVC,每個檔案的最大大小為1MB,單個請求中的檔案資料最大為10MB。您可以覆蓋這些值,中間資料的儲存位置(例如,到/tmp
目錄),以及使用MultipartProperties
類中公開的屬性將資料重新整理到磁碟的閾值。例如,如果要指定檔案不受限制,請將spring.servlet.multipart.max-file-size
屬性設定為-1
。
當您希望在Spring MVC控制器處理程式方法中接收多部分編碼檔案資料作為@RequestParam
型別的註釋引數時,多部分支援非常有用MultipartFile
。
有關MultipartAutoConfiguration
詳細資訊,請參閱 原始碼。
建議使用容器的內建支援進行分段上傳,而不是引入其他依賴項,例如Apache Commons File Upload。 |
關閉Spring MVC DispatcherServlet
預設情況下,所有內容都是從應用程式的根目錄(/
)提供的。如果您希望對映到其他路徑,可以按如下方式配置:
spring.mvc.servlet.path=/acme
如果你有額外的servlet你可以宣告一個@Bean
型別Servlet
或 ServletRegistrationBean
每個servlet ,Spring Boot會將它們透明地註冊到容器中。因為servlet是以這種方式註冊的,所以可以將它們對映到DispatcherServlet
不呼叫它的子上下文。
配置DispatcherServlet
你自己是不尋常的,但如果你真的需要這樣做,還必須提供一種 @Bean
型別DispatcherServletPath
來提供你自定義的路徑DispatcherServlet
。
關閉預設MVC配置
完全控制MVC配置的最簡單方法是為您自己 @Configuration
提供@EnableWebMvc
註釋。這樣做會將所有MVC配置留在您的手中。
自定義ViewResolvers
A ViewResolver
是Spring MVC的核心元件,將檢視名稱轉換 @Controller
為實際View
實現。注意,ViewResolvers
主要用於UI應用程式,而不是REST樣式的服務(a View
不用於呈現a @ResponseBody
)。有許多實現ViewResolver
可供選擇,而Spring本身並不反對你應該使用哪些實現。另一方面,Spring Boot會為您安裝一個或兩個,具體取決於它在類路徑和應用程式上下文中找到的內容。它DispatcherServlet
使用它在應用程式上下文中找到的所有解析器,依次嘗試每個解析器直到得到結果,因此,如果新增自己的解析器,則必須知道順序以及新增解析器的位置。
WebMvcAutoConfiguration
在ViewResolvers
您的上下文中新增以下內容:
- 一個
InternalResourceViewResolver
名為'defaultViewResolver'。這個可以通過使用DefaultServlet
(包括靜態資源和JSP頁面,如果您使用它們)來定位可以呈現的物理資源。它將字首和字尾應用於檢視名稱,然後在servlet上下文中查詢具有該路徑的物理資源(預設值為空,但可通過spring.mvc.view.prefix
和訪問外部配置spring.mvc.view.suffix
)。您可以通過提供相同型別的bean來覆蓋它。 - 一個
BeanNameViewResolver
名為'beanNameViewResolver'。這是檢視解析器鏈的一個有用成員,並獲取與View
正在解析的名稱相同的任何bean 。不必覆蓋或替換它。 - 一個
ContentNegotiatingViewResolver
名為“ViewResolver的”只如果有新增的 實際型別的豆類View
存在。這是一個“主”解析器,委託給所有其他人,並嘗試找到與客戶端傳送的“Accept”HTTP頭匹配的內容。有一個有用的 部落格ContentNegotiatingViewResolver
,您可能希望學習以瞭解更多資訊,您也可以檢視原始碼以獲取詳細資訊。您可以ContentNegotiatingViewResolver
通過定義名為“viewResolver”的bean 來關閉自動配置 。 - 如果你使用Thymeleaf,你也有一個
ThymeleafViewResolver
名為'thymeleafViewResolver'。它通過使用字首和字尾包圍檢視名稱來查詢資源。字首是spring.thymeleaf.prefix
,字尾是spring.thymeleaf.suffix
。字首和字尾的值分別預設為“classpath:/ templates /”和“.html”。您可以ThymeleafViewResolver
通過提供相同名稱的bean 來覆蓋 。 - 如果您使用FreeMarker,您還有一個
FreeMarkerViewResolver
名為'freeMarkerViewResolver'。它spring.freemarker.templateLoaderPath
通過用字首和字尾包圍檢視名稱來查詢載入器路徑中的資源(外部化並具有預設值'classpath:/ templates /')。字首外部spring.freemarker.prefix
化為,字尾外部化為spring.freemarker.suffix
。字首和字尾的預設值分別為空和“.ftl”。您可以FreeMarkerViewResolver
通過提供相同名稱的bean 來覆蓋。 - 如果您使用Groovy模板(實際上,如果
groovy-templates
在您的類路徑中),您還有一個GroovyMarkupViewResolver
名為'groovyMarkupViewResolver'。它通過用字首和字尾(外部化為spring.groovy.template.prefix
和spring.groovy.template.suffix
)包圍檢視名稱來查詢載入器路徑中的資源。字首和字尾分別具有“classpath:/ templates /”和“.tpl”的預設值。您可以GroovyMarkupViewResolver
通過提供相同名稱的bean 來覆蓋。
有關更多詳細資訊,請參閱以下部分:
WebMvcAutoConfiguration
ThymeleafAutoConfiguration
FreeMarkerAutoConfiguration
GroovyTemplateAutoConfiguration