開發RESTful API 時,一般都會在Controller上加上@Controller注解,但是有時候加上@RestController,當同事問為什么的時候,我也一臉懵逼,默默的看了資料,現在就說說他們的區別。
@RestController注解等價於@ResponseBody + @Controller。@RestController和@Controller的共同點是都用來表示Spring某個類是否可以接收HTTP請求,二者區別: @RestController無法返回指定頁面,而@Controller可以;前者可以直接返回數據,后者需要@ResponseBody輔助。下面詳細分析。
① 是否可以返回頁面
答:@RestController無法返回指定頁面,而@Controller可以。
解析:對於Controller, 如果只是使用@RestController注解,則其方法無法返回指定頁面,此時配置的視圖解析器 InternalResourceViewResolver不起作用,返回的內容就是 return 里的內容。 如果需要返回到指定頁面,則需要用 @Controller配合視圖解析器InternalResourceViewResolver才行。
② 返回內容
如果需要返回JSON,XML或自定義mediaType內容到頁面,@RestController自己就可以搞定,這個注解對於返回數據比較方便,因為它會自動將對象實體轉換為JSON格式。而@Controller需要在對應的方法加上@ResponseBody注解。
示例:
import java.util.HashMap; import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/difference") public class DifferenceController { // 跳轉到上傳文件的頁面 @RequestMapping(value = "/goToSuccessPage", method = RequestMethod.GET) public String goToSuccessPage() { // 跳轉到 視圖層 success.html return "success"; } @RequestMapping(value = "findAll", method = RequestMethod.GET) public Map<String, String> findAll() { Map<String, String> all = new HashMap<>(); all.put("remark", "可以返回json,xml或自定義mediaType內容到頁面"); return all; } }
