spring - 将 ResponseEntity<T> 和 @RestController 用于 Spring RESTful 应用程序时

标签 spring spring-mvc spring-3 spring-4

我正在使用 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;
}

我的问题是:

  1. 出于正当理由特定场景必须强制使用一个选项而不是另一个选项
  2. 如果 (1) 无关紧要,建议采用什么方法以及原因。

最佳答案

ResponseEntity 旨在表示整个 HTTP 响应。您可以控制其中的任何内容:状态代码、标题和正文。

@ResponseBody 是 HTTP 响应正文的标记,@ResponseStatus 声明 HTTP 响应的状态码。

@ResponseStatus 不是很灵活。它标记了整个方法,因此您必须确保您的处理程序方法始终以相同的方式运行。而且您仍然无法设置标题。您需要 HttpServletResponse

基本上,ResponseEntity 可以让您做更多事情。

关于spring - 将 ResponseEntity<T> 和 @RestController 用于 Spring RESTful 应用程序时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549379/

相关文章:

java - SQL 错误 17268 : Year out of range (Java/Spring)

java - 具有两个来源的 Spring 集成流程

javascript - 如何使用 Spring MVC 将 Java Map 放入 Optgroup 选项中?

java - Eclipse:删除类似 "Unnecessary cast from Object to Object"的警告

mysql - Spring 3 - Hibernate 3 - 查询多个 MySQL 数据库

java - 无法呈现不是字符串的属性,toString 返回 : null ERROR in SPRING MVC

java - 如何检查Grails应用程序的GORM版本

Spring中基于Java的依赖注入(inject)

model-view-controller - spring 3.0 MVC 似乎忽略了 messages.properties

java - Hibernate 验证 没有验证