[英]Return only string message from Spring MVC 3 Controller
誰能告訴我如何從控制器返回字符串消息?
如果我只是從控制器方法返回一個字符串,那么 spring mvc 將其視為 jsp 視圖名稱。
使用@ResponseBody
在控制器中注釋您的方法:
@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
return "Response!";
}
來自: 15.3.2.6 使用@ResponseBody
注釋映射響應主體:
@ResponseBody
注釋 [...] 可以放在方法上,並指示返回類型應直接寫入 HTTP 響應正文(而不是放置在模型中,或解釋為視圖名稱)。
在 Spring 4 中,如果您的 Controller 使用@RestController
而不是@Controller
注釋,則您不需要@ResponseBody
注釋。
代碼將是
@RestController
public class FooController {
@RequestMapping(value="/controller", method=GET)
public String foo() {
return "Response!";
}
}
你可以在這里找到@RestController
的 Javadoc
雖然@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";
}
最簡單的解決方案:
只需添加引號,我真的不知道為什么當響應類型定義為 application/json 時它沒有由 Spring boot 自動實現,但它工作得很好。
@PostMapping("/create")
public String foo()
{
String result = "something"
return "\"" + result + "\"";
}
@Controller
public class HelloController {
@RequestMapping(value = "/", method = RequestMethod.GET)
ResponseEntity<String> sayHello() {
return ResponseEntity.ok("Hello");
}
}
@ResponseBody
@RequestMapping(value="/get-text", produces="text/plain")
public String myMethod() {
return "Response!";
}
@ResponseBody
嗎?這表明該方法返回一些文本而不是將其解釋為視圖等。
produces="text/plain"
嗎?這只是一個很好的做法,因為它說明了該方法將返回的內容:)
有兩種可能的解決方案
使用@Controller
和@ResponseBody
,結合不同功能的 HTML 頁面和字符串消息
@Controller @RequestMapping({ "/user/registration"}) public class RegistrationController { @GetMapping public String showRegistrationForm(Model model) { model.addAttribute("user", new UserDto()); return "registration"; //Returns the registration.html } @PostMapping @ResponseBody public String registerUserAccount(@Valid final UserDto accountDto, final HttpServletRequest request) { LOGGER.debug("Registering user account with information: {}", accountDto); return "Successfully registered" // Returns the string }
使用@RestController
返回字符串消息。 在這種情況下,您不能擁有返回 HTML 頁面的函數。
@RestController @RequestMapping({ "/user/registration"}) public class RegistrationController { @PostMapping public String registerUserAccount(@Valid @RequestBody final UserDto accountDto, final HttpServletRequest request) { LOGGER.debug("Registering user account with information: {}", accountDto); return "Successfully registered" // Returns the string }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.