[解決済み] 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)が問題にならない場合、どのようなアプローチを提案するか、またその理由。
解決方法は?
ResponseEntity
は、HTTPレスポンス全体を表すためのものです。ステータスコード、ヘッダー、ボディなど、その中に入るものはすべて制御できます。
@ResponseBody
はHTTPレスポンスボディのマーカーであり
@ResponseStatus
は、HTTP レスポンスのステータスコードを宣言しています。
@ResponseStatus
はあまり柔軟ではありません。メソッド全体をマークしてしまうので、ハンドラメソッドが常に同じように動作することを確認する必要があります。また、ヘッダーを設定することもできません。そのためには
HttpServletResponse
.
基本的には
ResponseEntity
を使えば、もっといろいろなことができるようになります。
関連
-
[解決済み] Spring Hibernate - 現在のスレッドのトランザクション同期セッションを取得できませんでした。
-
[解決済み】Unit TestからApplicationContextを読み込むのに失敗しました。FileNotFound
-
Tomcat server_A 子コンテナの起動に失敗しました。
-
ServletContextリソース[/WEB-INF/springmvc-servlet.xml]を開くことができませんでした。
-
[解決済み] Spring Bootアプリケーションにポートを設定する方法
-
[解決済み] springの@Controllerアノテーションと@RestControllerアノテーションの違いについて
-
[解決済み】Spring MVCとSpring Bootの違い【終了しました
-
[解決済み] MockitoでSpringの自動配線された@Valueフィールドをモックするにはどうすればよいですか?
-
[解決済み] Spring MVC Test によるマルチパート POST リクエストの単体テスト
-
[解決済み] YAMLを使ったSpring @PropertySource
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】自動配線された依存関係のインジェクションに失敗しました。
-
[解決済み] CommandLineRunnerの実行に失敗しました - Spring Batch
-
SpringプロジェクトがファイルapplicationContext.xmlを解決できないエラー
-
[解決済み】ビーン初期化完了後にメソッドを呼び出すには?
-
[解決済み】SpringのGA、RC、M2リリースの違いは何ですか?
-
[解決済み】Springでは、オプションのパス変数を作ることができますか?
-
[解決済み] Spring 3 RequestMapping。パスの値を取得する
-
[解決済み] スコープ("prototype")ビーンスコープで新しいビーンが作成されない
-
[解決済み] プロパティファイルから値を読み込むには?
-
[解決済み] Springでjar内のファイルが表示されない