Spring框架:@RestController與@Controller
瞭解如何利用SpringMVC的註釋建立RESTful Web服務。
Spring的基於註釋的MVC框架簡化了建立RESTful Web服務的過程。傳統的Spring MVC控制器和RESTful Web服務控制器之間的關鍵區別在於: 建立HTTP響應主體的方式。
雖然傳統的MVC控制器依賴於View技術,但RESTful Web服務控制器只返回物件,物件資料作為JSON / XML直接寫入HTTP響應。
以下步驟描述了典型的Spring MVC REST工作流:
- 客戶端以URI形式向Web服務傳送請求。
- 該請求被DispatcherServlet攔截,該伺服器查詢Handler Mappings及其型別。
- 應用程式上下文檔案中定義的Handler Mappings部分告訴DispatcherServlet使用哪種策略根據傳入請求查詢控制器。
- Spring MVC支援三種不同型別的對映請求URI到控制器:註釋,名稱約定和顯式對映。
請求由Controller處理,響應返回到DispatcherServlet,然後DispatcherServlet將排程到檢視。
使用@Controller時需要用@ResponseBody註釋
Spring 3.x 或使用@Controller情況下,在方法上使用@ResponseBody註釋時,Spring會轉換返回值並自動將其寫入HTTP響應。Controller類中的每個方法都必須使用@ResponseBody進行註釋。
Spring有一個在後臺註冊的HttpMessageConverters列表。HTTPMessageConverter的職責是將請求主體轉換為特定類並再次返回響應主體,具體取決於預定義的mime型別。每次發出請求命中@ResponseBody時,Spring都會遍歷所有已註冊的HTTPMessageConverters,尋找符合給定mime型別和類的第一個,然後將其用於實際轉換。
@Controller @RequestMapping(<font>"employees"</font><font>) <b>public</b> <b>class</b> EmployeeController { Employee employee = <b>new</b> Employee(); @RequestMapping(value = </font><font>"/{name}"</font><font>, method = RequestMethod.GET, produces = </font><font>"application/json"</font><font>) <b>public</b> @ResponseBody Employee getEmployeeInJSON(@PathVariable String name) { employee.setName(name); employee.setEmail(</font><font>"[email protected]"</font><font>); <b>return</b> employee; } @RequestMapping(value = </font><font>"/{name}.xml"</font><font>, method = RequestMethod.GET, produces = </font><font>"application/xml"</font><font>) <b>public</b> @ResponseBody Employee getEmployeeInXML(@PathVariable String name) { employee.setName(name); employee.setEmail(</font><font>"[email protected]"</font><font>); <b>return</b> employee; } } </font>
注意@ResponseBody新增到返回值中的每個@RequestMapping方法,Spring將做兩件事:
- 將<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。
可在任何伺服器(例如,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 <b>public</b> <b>class</b> EmployeeController { Employee employee = <b>new</b> Employee(); @GetMapping(<font>"/employees/{name}"</font><font>) <b>public</b> Employee getEmployeeInJSON(@PathVariable(</font><font>"name"</font><font>) String name) { employee.setName(name); employee.setEmail(</font><font>"[email protected]"</font><font>); <b>return</b> employee; } } </font>
我們不再需要將@ResponseBody新增到請求對映方法中。進行更改後,再次在伺服器上執行應用程式會產生與以前相同的輸出。
使用@RestController非常簡單,這是從Spring v4.0開始建立MVC RESTful Web服務或基於SpringBoot 2的首選方法。