มีใครบอกฉันได้ไหมว่าฉันจะส่งคืนข้อความสตริงจากคอนโทรลเลอร์ได้อย่างไร
ถ้าฉันส่งคืนสตริงจากเมธอดคอนโทรลเลอร์ให้สปริง mvc ถือว่าเป็นชื่อมุมมอง jsp
มีใครบอกฉันได้ไหมว่าฉันจะส่งคืนข้อความสตริงจากคอนโทรลเลอร์ได้อย่างไร
ถ้าฉันส่งคืนสตริงจากเมธอดคอนโทรลเลอร์ให้สปริง mvc ถือว่าเป็นชื่อมุมมอง jsp
คำตอบ:
ใส่คำอธิบายประกอบวิธีของคุณในตัวควบคุมด้วย@ResponseBody
:
@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
return "Response!";
}
จาก: 15.3.2.6 การแมปเนื้อหาตอบกลับด้วย@ResponseBody
คำอธิบายประกอบ :
@ResponseBody
บันทึกย่อ [ ... ] สามารถวางบนวิธีการและแสดงให้เห็นว่าผลตอบแทนประเภทควรจะเขียนตรงไปที่ร่างกายตอบสนอง HTTP (และไม่ได้อยู่ในรูปแบบหรือตีความว่าเป็นชื่อมุมมอง)
ด้วย Spring 4 หากคอนโทรลเลอร์ของคุณมีคำอธิบายประกอบ@RestController
แทนคุณ@Controller
ก็ไม่จำเป็นต้องมี@ResponseBody
คำอธิบายประกอบ
รหัสจะเป็น
@RestController
public class FooController {
@RequestMapping(value="/controller", method=GET)
public String foo() {
return "Response!";
}
}
คุณสามารถค้นหา Javadoc ได้@RestController
ที่นี่
แม้ว่า @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) {
...
}
}
แต่วิธีแรกดีกว่า คุณสามารถใช้วิธีนี้หากคุณต้องการส่งคืนการตอบกลับด้วยประเภทเนื้อหาที่กำหนดเองหรือส่งคืนประเภทไบนารี (ไฟล์ ฯลฯ ... );
นี่เป็นเพียงหมายเหตุสำหรับผู้ที่อาจพบคำถามนี้ในภายหลัง แต่คุณไม่จำเป็นต้องดึงคำตอบเพื่อเปลี่ยนประเภทเนื้อหา นี่คือตัวอย่างด้านล่างเพื่อดำเนินการดังกล่าว:
@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);
}
สิ่งที่เกี่ยวกับ:
PrintWriter out = response.getWriter();
out.println("THE_STRING_TO_SEND_AS_RESPONSE");
return null;
กระทะนี้สำหรับฉัน
สำหรับการส่งออกString
ตามการtext/plain
ใช้งาน:
@RequestMapping(value="/foo", method=RequestMethod.GET, produces="text/plain")
@ResponseBody
public String foo() {
return "bar";
}
วิธีแก้ปัญหาที่ง่ายที่สุด:
เพียงแค่เพิ่มคำพูดฉันไม่รู้จริงๆว่าทำไม Spring boot ถึงไม่ติดตั้งอัตโนมัติเมื่อประเภทการตอบสนองกำหนดเป็น application / json แต่มันใช้งานได้ดี
@PostMapping("/create")
public String foo()
{
String result = "something"
return "\"" + result + "\"";
}
@RequestMapping(value="/controller", method=GET, produces="text/plain")