spring - 使用 ResponseEntity <T> 和 @RestController 作為 spring rest式應用程序時

  显示原文与译文双语对照的内容
82 5

我正在使用 Spring Framework 4.0.7,以及MVC和 Rest

我可以在以下情況下工作:

  • @Controller
  • ResponseEntity<T>

例如:


@Controller


@RequestMapping("/person")


@Profile("responseentity")


public class PersonRestResponseEntityController {



使用該方法( 僅用於創建)


@RequestMapping(value="/", method=RequestMethod.POST)


public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){


 logger.info("PersonRestResponseEntityController - createPerson");


 if(person==null)


 logger.error("person is null!!!");


 else


 logger.info("{}", person.toString());



 personMapRepository.savePerson(person);


 HttpHeaders headers = new HttpHeaders();


 headers.add("1","uno");


//http://localhost:8080/spring-utility/person/1


 headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());



 return new ResponseEntity<>(headers, HttpStatus.CREATED);


}



返回一些東西


@RequestMapping(value="/{id}", method=RequestMethod.GET)


public ResponseEntity<Person> getPerson(@PathVariable Integer id){


 logger.info("PersonRestResponseEntityController - getPerson - id: {}", id);


 Person person = personMapRepository.findPerson(id);


 return new ResponseEntity<>(person, HttpStatus.FOUND);


}



工作正常

我可以用做同樣的工作:

  • @RestController ( 我知道它與 @Controller + @ResponseBody 相同)
  • @ResponseStatus

例如:


@RestController


@RequestMapping("/person")


@Profile("restcontroller")


public class PersonRestController {



使用該方法( 僅用於創建)


@RequestMapping(value="/", method=RequestMethod.POST)


@ResponseStatus(HttpStatus.CREATED)


public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){


 logger.info("PersonRestController - createPerson");


 if(person==null)


 logger.error("person is null!!!");


 else


 logger.info("{}", person.toString());



 personMapRepository.savePerson(person);


 response.setHeader("1","uno");



//http://localhost:8080/spring-utility/person/1


 response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());


}



返回一些東西


@RequestMapping(value="/{id}", method=RequestMethod.GET)


@ResponseStatus(HttpStatus.FOUND)


public Person getPerson(@PathVariable Integer id){


 logger.info("PersonRestController - getPerson - id: {}", id);


 Person person = personMapRepository.findPerson(id);


 return person;


}



我的問題是:

  • 當一個具體原因或者特定場景時,必須在另一個選項中使用 mandatorily
  • 如果( 1 ) 不重要,建議採用什麼方法,以及。
时间: 原作者:

60 4

ResponseEntity 是用來表示整個HTTP響應的。 你可以控制任何進入它的內容: 狀態代碼,標題和正文。

@ResponseBody 是HTTP響應體的標記,@ResponseStatus 聲明HTTP響應的狀態代碼。

@ResponseStatus 不是很靈活,它標記了整個方法,因這裡你必須確保處理程序方法始終相同。 但你還是無法設定標題。 你需要 HttpServletResponse 或者 HttpHeaders 參數。

基本上,ResponseEntity 讓你做更多。

原作者:
65 4

從 Sotorios Delimanolis中完成答案。

它讓你更靈活,但是大多數情況下你不需要它,所以在控制器中你會遇到這些 ResponseEntity,從而使得你難以閱讀和理解。

如果要處理諸如錯誤( 。未找到,衝突,等等 ) 之類的特殊情況,可以向配置中添加一個 HandlerExceptionResolver 插件。 因此在代碼中,只拋出特定異常( 。NotFoundException 實例) 並決定處理程序( 將HTTP狀態設置為 404 ) 中應該做什麼,使控制器代碼更加清晰。

原作者:
80 5

根據官方文檔:使用 @RestController 註釋創建REST控制器。

@RestController 是一個將 @ResponseBody 和 @Controller. 結合起來的構造型註釋 比這更多,它給你的控制器更多的意義,並且在未來版本的版本中也可以攜帶額外的語義。

看起來最好使用 @RestController,但是你也可以將與 ResponseEntity 結合起來,以便在需要時進行靈活的處理。

例如:


@RestController


public class MyController {



 @GetMapping(path ="/test")


 @ResponseStatus(HttpStatus.OK)


 public User test() {


 User user = new User();


 user.setName("Name 1");



 return user;


 }



}



下面的相同:


@RestController


public class MyController {



 @GetMapping(path ="/test")


 public ResponseEntity<User> test() {


 User user = new User();


 user.setName("Name 1");



 HttpHeaders responseHeaders = new HttpHeaders();


//...


 return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);


 }



}



這樣,只有在需要時才能定義 ResponseEntity

更新

你可以使用:


 return ResponseEntity.ok().headers(responseHeaders).body(user);



...