Spring Boot 學習系列(05)—自定義檢視解析規則
此文已由作者易國強授權網易雲社群釋出。
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。
自定義檢視解析
在預設情況下Spring Boot 的MVC框架使用的檢視解析ViewResolver類是ContentNegotiatingViewResolver,這個解析器比較智慧,它會根據你的請求型別(一般以請求uri的字尾來區分或請求頭的Accept得到)來自動選擇返回的資料文件型別。
一般情況下,這個能滿足大部分人的使用需求,但我們這裡只是需要提供RESTful介面的話,那麼這個解析規則就不太適合我們了,比如說我們的心跳檢測controller中如果返回的是非字串型別的資料(字串預設是可以解析成功的),那麼就會提示解析失敗的錯誤,
或如下的異常資訊:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation ....
在這裡我們可以在主入口類中繼承WebMvcConfigurerAdapter類,修改預設檢視解析的解析規則,示例如下所示,這裡favorPathExtension方法表示是否支援字尾匹配,我們這裡直接設定為false即可實現我們的需求,其他不做任何修改,那麼我們的所以返回結果會根據自定義的解析策略返回jackson解析的json格式資料。
@SpringBootApplicationpublic class BingoWebApplication extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(BingoWebApplication.class, args); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false); } }
上面程式碼中提到ContentNegotiationConfigurer 這個配置類還可以自定義很多解析的規則,比如ignoreAcceptHeader方式設定是否匹配請求頭的資訊,defaultContentType方法設定預設匹配型別等等。具體大家可以自己試下。
另外,如果我們需要自定義其他解析器,比如我們常用的freemarker的解析器,那麼也很簡單,我們仍然可以在主入口類中繼承WebMvcConfigurerAdapter類或自定義一個類繼承WebMvcConfigurerAdapter類,但需要注意自定義類需要加上@Configuration的註解,然後在裡面我們例項化一個檢視解析的bean即可。如下所示:
@Beanpublic FreeMarkerViewResolver getFreeMarkerViewResolver(){ FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); resolver.setPrefix(""); resolver.setSuffix(".ftl"); resolver.setContentType("text/html; charset=UTF-8"); resolver.setRequestContextAttribute("rc"); return resolver; }
上面的程式碼很簡單,實際和我們平時在xml中配置的檢視解析配置一樣。這個Bean實際是覆蓋了預設的viewResolver,達到了自定義解析的目的。
擴充套件
上面簡單介紹瞭如果需要自定義freemarker的檢視解析該如何配置,實際上還有另外的方法,spring boot 其實已經幫我們做了很多事情,比如說它集成了freemarker的功能,那麼我們只需要引入相關的依賴即可達到我們的目的,在pom檔案中加入如下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId></dependency>
加入上述依賴即可正常使用freemarker的功能,預設情況下無需其他的配置,我們的靜態檔案可以放在工程的static目錄,模板檔案則放在templates目錄下即可,這兩個目錄在我們新建工程的時候就自動幫我建立完成了,如果不是採用的框架自動建立的,那麼手動建立此目錄即可,當然你可以設定其他自定義的存放目錄,在核心配置檔案中自定義設定即可,比如設定ftl檔案路徑 :spring.freemarker.template-loader-path=classpath:/templates
不足之處,歡迎指正,謝謝~
更多網易技術、產品、運營經驗分享請點選。
相關文章:
【推薦】 認識使用者訪談