Spring框架:@RestController與@Controller

banq發表於2018-12-04

瞭解如何利用SpringMVC的註釋建立RESTful Web服務。
Spring的基於註釋的MVC框架簡化了建立RESTful Web服務的過程。傳統的Spring MVC控制器和RESTful Web服務控制器之間的關鍵區別在於: 建立HTTP響應主體的方式。
雖然傳統的MVC控制器依賴於View技術,但RESTful Web服務控制器只返回物件,物件資料作為JSON / XML直接寫入HTTP響應。

以下步驟描述了典型的Spring MVC REST工作流:
  1. 客戶端以URI形式向Web服務傳送請求。
  2. 該請求被DispatcherServlet攔截,該伺服器查詢Handler Mappings及其型別。
    • 應用程式上下文檔案中定義的Handler Mappings部分告訴DispatcherServlet使用哪種策略根據傳入請求查詢控制器。
    • Spring MVC支援三種不同型別的對映請求URI到控制器:註釋,名稱約定和顯式對映。
  3. 請求由Controller處理,響應返回到DispatcherServlet,然後DispatcherServlet將排程到檢視。 

    使用@Controller時需要用@ResponseBody註釋
    Spring 3.x 或使用@Controller情況下,在方法上使用@ResponseBody註釋時,Spring會轉換返回值並自動將其寫入HTTP響應。Controller類中的每個方法都必須使用@ResponseBody進行註釋。
    Spring有一個在後臺註冊的HttpMessageConverters列表。HTTPMessageConverter的職責是將請求主體轉換為特定類並再次返回響應主體,具體取決於預定義的mime型別。每次發出請求命中@ResponseBody時,Spring都會遍歷所有已註冊的HTTPMessageConverters,尋找符合給定mime型別和類的第一個,然後將其用於實際轉換。

    @Controller
    @RequestMapping("employees")
    public class EmployeeController {
        Employee employee = new Employee();
        @RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
        public @ResponseBody Employee getEmployeeInJSON(@PathVariable String name) {
           employee.setName(name);
           employee.setEmail("employee1@genuitec.com");
        return employee; 
        }
    
        @RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
        public @ResponseBody Employee getEmployeeInXML(@PathVariable String name) {
           employee.setName(name);
         employee.setEmail("employee1@genuitec.com");
           return employee; 
        }
    }
    



    注意@ResponseBody新增到返回值中的每個@RequestMapping方法,Spring將做兩件事:
    1. 將<context:component-scan> 和  <mvc:annotation-driven /> 標記新增  到Spring配置檔案中。
      • <context:component-scan> 啟用註釋並掃描包以在應用程式上下文中查詢和註冊bean。 
      • <mvc:annotation-driven/> 如果Jackson / JAXB庫在類路徑上,則新增對讀寫JSON / XML的支援。 
      • 對於JSON格式,包括jackson-databind jar,對於XML,包括專案類路徑的jaxb-api-osgi jar。
    2. 可在任何伺服器(例如,Tomcat)上部署並執行應用程式。
       http://localhost:8080/SpringRestControllerExample/rest/employees/Bob  並顯示輸出JSON.
      http://localhost:8080/SpringRestControllerExample/rest/employees/Bob.xml 輸出XML


      使用@RestController
      Spring 4.0引入了@RestController,這是一個控制器的專用版本,它是一個方便的註釋,除了自動新增@Controller和@ResponseBody註釋之外沒有其他新魔法。
      透過使用@RestController批註對控制器類進行註釋,您不再需要將@ResponseBody新增到所有請求對映方法中。@ResponseBody註釋預設處於活動狀態。
      要在我們的示例中使用@RestController,我們需要做的就是將@Controller修改為@RestController並從每個方法中刪除@ResponseBody。結果類應如下所示:

      @RestController
      public class EmployeeController {
      
          Employee employee = new Employee();
      
          @GetMapping("/employees/{name}")
          public Employee getEmployeeInJSON(@PathVariable("name") String name) {
             employee.setName(name);
             employee.setEmail("employee1@genuitec.com");
             return employee;
          }
       
      }
      


      我們不再需要將@ResponseBody新增到請求對映方法中。進行更改後,再次在伺服器上執行應用程式會產生與以前相同的輸出。

      使用@RestController非常簡單,這是從Spring v4.0開始建立MVC RESTful Web服務或基於SpringBoot 2的首選方法。
    3. 相關文章