web-dev-qa-db-ja.com

Spring MVCコントローラーメソッドが値を返さない場合に返すものは何ですか?

JQueryの$.getJSON()を使用して、単純なSpring MVCバックエンドへの非同期呼び出しを行っています。ほとんどのSpringコントローラーメソッドは次のようになります。

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   

各コントローラーが@ResponseBodyをJSONとして返すように設定していますが、これはクライアント側が期待するものです。

しかし、リクエストがクライアント側にコンテンツを返さないと仮定するとどうなりますか?持ってもいいですか:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

そうでない場合、ここで使用する適切な構文は何ですか?前もって感謝します!

116
IAmYourFaja

voidを返すことができ、@ ResponseBodyを必要としない@ResponseStatus(value = HttpStatus.OK)でメソッドをマークする必要があります

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Getメソッドのみが200ステータスコードの暗黙を返します。他のすべてのメソッドは、次の3つのいずれかを実行します。

  • Voidを返し、@ResponseStatus(value = HttpStatus.OK)でメソッドをマークします
  • オブジェクトを返し、@ResponseBodyでマークします
  • HttpEntityインスタンスを返します
225
ams

適切なヘッダーを持つResponseEntityを単に返すことができます:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
40
Biju Kunjummen

「ResponseEntity」オブジェクトを返すことができます。 「ResponseEntity」オブジェクトの使用は、応答オブジェクト(応答本文とHTTPステータスコードを含む)を構築するときと、応答オブジェクトから情報を取得するときの両方で非常に便利です。

GetHeaders()、getBody()、getContentType()、getStatusCode()などのメソッドを使用すると、ResponseEntityオブジェクトの読み取り作業が非常に簡単になります。

HTTPステータスコード204(コンテンツなし)のResponseEntityオブジェクトを使用する必要があります。これは、要求が適切に処理され、応答本文が意図的に空白であることを具体的に指定するためです。適切な情報を伝えるために適切なステータスコードを使用することは、特に複数のクライアントアプリケーションで使用されるAPIを作成する場合は非常に重要です。

8
Harley

はい、戻り値の型voidで@ResponseBodyを使用できます。

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
3
user1338062

Void @ResponseBodyを返すことに何の問題もありません。また、POST要求に対しても必要です。

HTTPステータスコードを使用して、他の人が成功ステータスに言及しているのではなく、例外ハンドラルーチン内でエラーを定義します。あなたが持っている通常のメソッドは、あなたが望むものである200の応答コードを返します。そして、例外ハンドラはエラーオブジェクトと異なるコード(すなわち500)を返すことができます。

2
Brett Ryan

しかし、システムのサイズと機能が大きくなるにつれて...常にjsonを返すことは悪い考えではないと思います。より建築的/「大規模設計」の問題です。

コードとデータという2つの既知のフィールドを持つJSONを常に取得することを考えることができます。 codeは、実行される操作の成功を指定する数値コードであり、dataは、要求された操作/サービスに関連する追加データです。

さあ、サービスプロバイダーのバックエンドを使用するとき、どのサービスでもそれがうまく機能したかどうかを確認することができます。

だから私は固執し、春がこれを管理しないように、ハイブリッド返品操作を公開します(他の何もデータを返さない...)..あなたのサーバーがより均質なインターフェースを公開することを確認してください。一日の終わりにはもっと簡単です。

1
Victor

非同期メソッドのために私がしたことのサンプルコードは次のとおりです

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{
    accountingSystemHandler.importData(file, assignChargeCodes);
}

メソッドから何も返す必要はありません。このアノテーションを使用するために必要なのは、メソッドがすべての場合にOKを返すようにするためです。

@ResponseStatus(value = HttpStatus.OK)
0
AbdusSalam