Spring MVC 3コントローラーから文字列メッセージのみを返す


93

コントローラーから文字列メッセージを返す方法を教えてもらえますか?

コントローラーメソッドから文字列を返すだけの場合は、mvcをSpringしてjspビュー名として扱います。

回答:


191

コントローラでメソッドに注釈を付けます@ResponseBody

@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
    return "Response!";
}

From:15.3.2.6 @ResponseBodyアノテーションとレスポンス本文のマッピング

@ResponseBody注釈は、[...]は、方法に置くことができ、戻り型がHTTPレスポンスボディに直接書き込まれた(モデルに入れていない、またはビュー名として解釈)されるべきであることを示しています。


27
わかりやすくするために、 produces = "text / plain @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322

本当の答えは常にコメントにあります。
ヨハネススタドラー

48

Spring 4では、コントローラーにの@RestController代わりにアノテーションが付けられている@Controller場合、@ResponseBodyアノテーションは必要ありません。

コードは

@RestController
public class FooController {

   @RequestMapping(value="/controller", method=GET)
   public String foo() {
      return "Response!";
   }

}

あなたはここのJavadocを見つけることができます@RestController


おかげで、これは、文字列ではなくビューを返すために\ @RestControllerではなく\ @Controllerを使用する必要があることを理解するのに役立ちました。
khriskooper

@khriskooperはそれを聞いてうれしく思いました:)
geoand

18

@Tomaszは完全に正しいですが、別の方法もあります:

@RequestMapping(value="/controller", method=GET)
public void foo(HttpServletResponse res) {
    try {       
        PrintWriter out = res.getWriter();
        out.println("Hello, world!");
        out.close();
    } catch (IOException ex) { 
        ...
    }
}

しかし、最初の方法が望ましいです。カスタムコンテンツタイプまたはバイナリタイプ(ファイルなど)で応答を返す場合は、このメソッドを使用できます。


ただのヘッドアップですが、このために応答を引き込む必要すらありません。
スコット

2番目のポイントとして、カスタムコンテンツタイプを設定する必要があるか、バイナリタイプを返す必要がある場合でも、それらの手段にはResponseEntityを使用できます。
スコット

6

これは、後でこの質問を見つける可能性のある人のためのメモですが、コンテンツタイプを変更するために応答を取得する必要はありません。これを行うための例を以下に示します。

@RequestMapping(method = RequestMethod.GET, value="/controller")
public ResponseEntity<byte[]> displayUploadedFile()
{
  HttpHeaders headers = new HttpHeaders();
  String disposition = INLINE;
  String fileName = "";
  headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

  //Load your attachment here

  if (Arrays.equals(Constants.HEADER_BYTES_PDF, contentBytes)) {
    headers.setContentType(MediaType.valueOf("application/pdf"));
    fileName += ".pdf";
  }

  if (Arrays.equals(Constants.HEADER_BYTES_TIFF_BIG_ENDIAN, contentBytes)
      || Arrays.equals(Constantsr.HEADER_BYTES_TIFF_LITTLE_ENDIAN, contentBytes)) {
    headers.setContentType(MediaType.valueOf("image/tiff"));
    fileName += ".tif";
  }

  if (Arrays.equals(Constants.HEADER_BYTES_JPEG, contentBytes)) {
    headers.setContentType(MediaType.IMAGE_JPEG);
    fileName += ".jpg";
  }

  //Handle other types if necessary

  headers.add("Content-Disposition", , disposition + ";filename=" + fileName);
  return new ResponseEntity<byte[]>(uploadedBytes, headers, HttpStatus.OK);
}

3

何について:

PrintWriter out = response.getWriter();
out.println("THE_STRING_TO_SEND_AS_RESPONSE");
return null;

これは私にとって中華鍋です。


3

用途に応じて出力Stringするtext/plain場合:

@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
    return "bar";
}

1
これは私にはうまくいきませんでした。Stringオブジェクトを返す前に、応答オブジェクトを取得してコンテンツタイプを明示的に設定する必要がありました。
ペドロマドリード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.