簡體   English   中英

僅從 Spring MVC 3 控制器返回字符串消息

[英]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"嗎?

這只是一個很好的做法,因為它說明了該方法將返回的內容:)

有兩種可能的解決方案

  1. 使用@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 }
  2. 使用@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM