Вернуть только строковое сообщение от контроллера Spring MVC 3

95

Может ли кто-нибудь сказать мне, как я могу вернуть строковое сообщение от контроллера?

Если я просто возвращаю строку из метода контроллера, тогда spring mvc обрабатывает ее как имя представления jsp.

user960567
источник

Ответы:

194

Аннотируйте свой метод в контроллере с помощью @ResponseBody:

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

От: 15.3.2.6 Сопоставление тела ответа с @ResponseBodyаннотацией :

@ResponseBodyАннотацию [...] может быть поставлен на метод и указывает на то, что тип возвращаемого значения должен быть записан прямо в тело ответа HTTP (и не помещается в одной модели, или интерпретируется как имя вида).

Томаш Нуркевич
источник
27
Чтобы было понятнее, я бы добавил @RequestMapping(value="/controller", method=GET, produces="text/plain")
productions
Настоящий ответ всегда в комментариях.
Йоханнес Стадлер,
49

В Spring 4, если ваш контроллер аннотирован @RestControllerвместо @Controller, вам не нужна @ResponseBodyаннотация.

Код будет

@RestController
public class FooController {

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

}

Вы можете найти Javadoc @RestController здесь

гео и
источник
Спасибо, это помогло мне понять, что мне нужно использовать \ @Controller вместо \ @RestController, чтобы вернуть представление, а не строку.
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) { 
        ...
    }
}

но предпочтительнее первый способ. Вы можете использовать этот метод, если хотите вернуть ответ с настраиваемым типом содержимого или вернуть двоичный тип (файл и т. Д.);

danny.lesnik
источник
Просто хедз-ап, но для этого вам даже не нужно тянуть ответ.
Скотт
Имелось в виду, что во втором пункте, касающемся необходимости установки настраиваемого типа контента или возврата двоичного типа, вы все равно можете использовать 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.
Педро Мадрид