1. 程式人生 > >Spring Boot中包含Spring MVC的啟動器

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還具有一些功能,可以更輕鬆地自定義此行為。

您可以使用環境配置ObjectMapperXmlMapper例項。Jackson提供了一套廣泛的簡單開/關功能,可用於配置其處理的各個方面。這些功能在六個enum(在Jackson中)中描述,它們對映到環境中的屬性:

列舉 屬性

com.fasterxml.jackson.databind.DeserializationFeature

spring.jackson.deserialization.<feature_name>

true, false

com.fasterxml.jackson.core.JsonGenerator.Feature

spring.jackson.generator.<feature_name>

true, false

com.fasterxml.jackson.databind.MapperFeature

spring.jackson.mapper.<feature_name>

true, false

com.fasterxml.jackson.core.JsonParser.Feature

spring.jackson.parser.<feature_name>

true, false

com.fasterxml.jackson.databind.SerializationFeature

spring.jackson.serialization.<feature_name>

true, false

com.fasterxml.jackson.annotation.JsonInclude.Include

spring.jackson.default-property-inclusion

alwaysnon_nullnon_absentnon_defaultnon_empty

例如,要啟用漂亮列印,請設定spring.jackson.serialization.indent_output=true。需要注意的是,由於使用了鬆弛繫結,因此indent_output不必匹配相應列舉常量的情況,即INDENT_OUTPUT

此基於環境的配置應用於自動配置的 Jackson2ObjectMapperBuilderbean,並應用於使用構建器建立的任何對映器,包括自動配置的ObjectMapperbean。

上下文Jackson2ObjectMapperBuilder可以由一個或多個Jackson2ObjectMapperBuilderCustomizerbean 自定義 。可以訂購這樣的定製器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是預設包含的型別(例如MappingJackson2HttpMessageConverterJSON轉換),則它將替換預設值。HttpMessageConverters提供了型別的便利bean, 如果使用預設的MVC配置,它總是可用的。它有一些有用的方法來訪問預設和使用者增強的訊息轉換器(例如,如果要手動將它們注入自定義,它可能很有用RestTemplate)。

與正常的MVC使用情況一樣,WebMvcConfigurer您提供的任何bean也可以通過覆蓋該configureMessageConverters方法來提供轉換器。但是,與普通MVC不同,您只能提供所需的其他轉換器(因為Spring Boot使用相同的機制來提供其預設值)。最後,如果您通過提供自己的@EnableWebMvc配置選擇退出Spring Boot預設MVC 配置,則可以完全控制並使用getMessageConvertersfrom 手動完成所有操作 WebMvcConfigurationSupport

有關WebMvcAutoConfiguration 更多詳細資訊,請參閱 原始碼。

處理多部分檔案上載

Spring Boot包含Servlet 3 javax.servlet.http.PartAPI以支援上傳檔案。預設情況下,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

ViewResolver是Spring MVC的核心元件,將檢視名稱轉換 @Controller為實際View實現。注意,ViewResolvers主要用於UI應用程式,而不是REST樣式的服務(a View不用於呈現a @ResponseBody)。有許多實現ViewResolver可供選擇,而Spring本身並不反對你應該使用哪些實現。另一方面,Spring Boot會為您安裝一個或兩個,具體取決於它在類路徑和應用程式上下文中找到的內容。它DispatcherServlet使用它在應用程式上下文中找到的所有解析器,依次嘗試每個解析器直到得到結果,因此,如果新增自己的解析器,則必須知道順序以及新增解析器的位置。

WebMvcAutoConfigurationViewResolvers您的上下文中新增以下內容:

  • 一個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.prefixspring.groovy.template.suffix)包圍檢視名稱來查詢載入器路徑中的資源。字首和字尾分別具有“classpath:/ templates /”和“.tpl”的預設值。您可以GroovyMarkupViewResolver通過提供相同名稱的bean 來覆蓋。

有關更多詳細資訊,請參閱以下部分: