網頁

2018/3/8

Spring MVC @RestController與@Controller的區別

從Spring MVC 4.0的多了@RestController,與傳統@Controller的差別其實只是@RestController等於@Controller搭配@ResponseBody

在撰寫RESTful API時,因為通常都是回傳json或xml,所以回傳無須交由View Resolver處理來返回頁面,所以會在Controller的API方法前加上@Responsebody來達成,例如:

@Controller
@RequestMapping(value="/api/user")
public class UserController {

  @Autowired
  UserService userService; 

  @RequestMapping(value="/all", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
  @ResponseBody
  public List<User> getUserJson(Model model){
    return userService.getAllUser();
  }

}

而在4.0後可改用@RestController,則該Controller類別中的方法回傳值都將預設為@ResponseBody,所以原本方法前的@ResponseBody就可以拿掉了。例如:

@RestController
@RequestMapping(value="/api/user")
public class UserController {
  
  @Autowired
  UserService userService;  
  
  @RequestMapping(value="/all", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
  public List<User> getUserJson(Model model){
    return userService.getAllUser();
  }

}

另外Spring MVC 4.3還多了@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping等對應RESTful API的HTTP method:GET,POST,PUT,DELETE,PATCH等,所以搭配以上就可以省略method的宣告了。

@RestController
@RequestMapping(value="/api/user")
public class UserController {
  
  @Autowired
  UserService userService;  
  
  @GetMapping(value="/all", produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
  public List<User> getUserJson(Model model){
    return userService.getAllUser();
  }

}

@RequestMapping中的produces屬性則是用來設定返回client端的Response內容格式,例如這邊設為MediaType.APPLICATION_JSON_UTF8_VALUE(等於"application/json;charset=UTF-8"),此設定實際會反映到Response Headers的Content-Type。



沒有留言:

張貼留言