ส่งคืนเฉพาะข้อความสตริงจาก Spring MVC 3 Controller


95

มีใครบอกฉันได้ไหมว่าฉันจะส่งคืนข้อความสตริงจากคอนโทรลเลอร์ได้อย่างไร

ถ้าฉันส่งคืนสตริงจากเมธอดคอนโทรลเลอร์ให้สปริง mvc ถือว่าเป็นชื่อมุมมอง jsp

คำตอบ:


197

ใส่คำอธิบายประกอบวิธีของคุณในตัวควบคุมด้วย@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

คำตอบที่แท้จริงอยู่ในความคิดเห็นเสมอ
Johannes Stadler

49

ด้วย Spring 4 หากคอนโทรลเลอร์ของคุณมีคำอธิบายประกอบ@RestControllerแทนคุณ@Controllerก็ไม่จำเป็นต้องมี@ResponseBodyคำอธิบายประกอบ

รหัสจะเป็น

@RestController
public class FooController {

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

}

คุณสามารถค้นหา Javadoc ได้@RestController ที่นี่


ขอบคุณสิ่งนี้ช่วยให้ฉันรู้ว่าฉันจำเป็นต้องใช้ \ @Controller แทน \ @RestController เพื่อที่จะส่งคืนมุมมองแทนที่จะเป็น String
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) { 
        ...
    }
}

แต่วิธีแรกดีกว่า คุณสามารถใช้วิธีนี้หากคุณต้องการส่งคืนการตอบกลับด้วยประเภทเนื้อหาที่กำหนดเองหรือส่งคืนประเภทไบนารี (ไฟล์ ฯลฯ ... );


เพียงแค่แจ้งให้ทราบล่วงหน้า แต่คุณไม่จำเป็นต้องดึงการตอบสนองสำหรับสิ่งนี้
Scott

ในแง่ที่สองเกี่ยวกับความจำเป็นในการตั้งค่าประเภทเนื้อหาที่กำหนดเองหรือส่งคืนประเภทไบนารีคุณยังคงสามารถใช้ ResponseEntity สำหรับวิธีการเหล่านั้นได้
Scott

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

สำหรับการส่งออกStringตามการtext/plainใช้งาน:

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

1
สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันต้องได้รับวัตถุตอบกลับและตั้งค่าประเภทเนื้อหาอย่างชัดเจนก่อนที่จะส่งคืนวัตถุ String
Pedro Madrid

0

วิธีแก้ปัญหาที่ง่ายที่สุด:

เพียงแค่เพิ่มคำพูดฉันไม่รู้จริงๆว่าทำไม Spring boot ถึงไม่ติดตั้งอัตโนมัติเมื่อประเภทการตอบสนองกำหนดเป็น application / json แต่มันใช้งานได้ดี

@PostMapping("/create")
public String foo()
{
    String result = "something"
    return "\"" + result + "\"";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.