Spring MVC 3 Controller'dan yalnızca dize mesajını döndür


95

Herhangi biri bana denetleyiciden dize mesajını nasıl döndürebileceğimi söyleyebilir mi?

Bir denetleyici yönteminden bir dize döndürürsem, bahar mvc onu bir jsp görünüm adı olarak ele alır.

Yanıtlar:


197

Yönteminize şu şekilde açıklama ekleyin @ResponseBody:

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

Kimden: 15.3.2.6 Yanıt gövdesinin @ResponseBodyek açıklama ile eşlenmesi :

@ResponseBodyAçıklama [...] bir yöntem koymak ve geri tip bir HTTP yanıtı gövdesine düz yazılmış (ve bir görünüm adı olarak bir model içine yerleştirilebilir veya yorumlanmaz) olması gerektiğini gösterir edilebilir.


27
Daha net hale getirmek için, üretir = "metin / düz @RequestMapping(value="/controller", method=GET, produces="text/plain")
user454322

Gerçek cevap her zaman yorumlardadır.
Johannes Stadler

49

Yay 4 ile, Denetleyiciniz @RestControlleryerine ile açıklama yapılmışsa, açıklamaya @Controllerihtiyacınız yoktur @ResponseBody.

Kod olurdu

@RestController
public class FooController {

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

}

Javadoc'u burada bulabilirsiniz@RestController


Teşekkürler, bu, bir String yerine bir görünüm döndürmek için \ @RestController yerine \ @Controller kullanmam gerektiğini anlamama yardımcı oldu.
khriskooper

@khriskooper bunu duyduğuma sevindim :)
geoand

18

@Tomasz kesinlikle haklı olsa da başka bir yolu daha var:

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

ancak ilk yöntem tercih edilir. Bu yöntemi, özel içerik türüyle yanıt döndürmek veya ikili tür (dosya, vb ...) döndürmek istiyorsanız kullanabilirsiniz;


Sadece bir uyarı, ancak bunun için yanıtı almanıza bile gerek yok.
Scott

İkinci nokta için, özel bir içerik türü ayarlamanız veya bir ikili tür döndürmenizle ilgili olarak, bu araçlar için ResponseEntity'yi yine de kullanabilirsiniz.
Scott

6

Bu, bu soruyu daha sonra bulabilecek olanlar için sadece bir not, ancak içerik türünü değiştirmek için yanıtı çekmeniz gerekmiyor. İşte tam da bunu yapmak için bir örnek:

@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

Ne dersin:

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

Bu benim için woks.


3

Çıkış olanağı için Stringolarak text/plainkullanılmak:

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

1
Bu benim için işe yaramadı. String nesnesini döndürmeden önce yanıt nesnesini almam ve içerik türünü açıkça ayarlamam gerekiyordu.
Pedro Madrid

0

En basit çözüm:

Sadece alıntı ekleyin, yanıt türü application / json olarak tanımlandığında neden Spring boot tarafından otomatik olarak uygulanmadığını gerçekten bilmiyorum, ama harika çalışıyor.

@PostMapping("/create")
public String foo()
{
    String result = "something"
    return "\"" + result + "\"";
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.