1. 程式人生 > >Spring Boot 學習系列(05)—自定義檢視解析規則

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




  • 不足之處,歡迎指正,謝謝~


免費體驗雲安全(易盾)內容安全、驗證碼等服務


更多網易技術、產品、運營經驗分享請點選


相關文章:
【推薦】 認識使用者訪談