Повернути лише рядкове повідомлення від контролера 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.