1. ホーム
  2. spring

[解決済み] Spring RESTfulアプリケーションでResponseEntity<T>と@RestControllerを使用する場合

2022-04-19 20:20:27

質問

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 を使えば、もっといろいろなことができるようになります。