Повернути лише рядкове повідомлення від контролера Spring MVC 3


94

Хто-небудь може сказати мені, як я можу повернути рядок повідомлення від контролера?

Якщо я просто повертаю рядок з методу контролера, тоді mvc сприймає його як ім'я подання jsp.

Відповіді:


192

Анотуйте свій метод у контролері за допомогою @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")
— produce

Реальна відповідь завжди в коментарях.
— Йоганнес Штадлер,

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 радий це почути :)
— геоі

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) { 
        ...
    }
}

але перший спосіб є кращим. Ви можете використовувати цей метод, якщо ви хочете повернути відповідь із користувацьким типом вмісту або повернути двійковий тип (файл тощо ...);


Просто зверніть увагу, але вам навіть не потрібно залучати відповідь для цього.
— Скотт

Мається на увазі, що для другого пункту, щодо необхідності встановлення користувацького типу вмісту або повернення двійкового типу, ви все одно можете використовувати 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.
— Педро Мадрид,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.