题 仅从Spring MVC 3 Controller返回字符串消息


任何人都可以告诉我如何从控制器返回字符串消息?

如果我只是从控制器方法返回一个字符串然后弹簧mvc将其视为jsp视图名称。


72
2017-10-06 10:09


起源




答案:


使用控件在控制器中注释您的方法 @ResponseBody

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

从: 15.3.2.6用响应体映射响应体 @ResponseBody 注解

@ResponseBody 注释[...]可以放在方法上,并指示返回类型应直接写入HTTP响应主体(而不是放在模型中,或解释为视图名称)。


154
2017-10-06 10:13



为了更清楚,我想补充一点 产生=“text / plain的  @RequestMapping(value="/controller", method=GET, produces="text/plain") - user454322


使用Spring 4,如果您的Controller使用注释 @RestController 代替 @Controller,你不需要 @ResponseBody 注解。

代码将是

@RestController
public class FooController {

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

}

你可以找到Javadoc @RestController  这里


36
2018-05-22 09:26



谢谢,这帮助我弄清楚我需要使用\ @Controller而不是\ @RestController才能返回视图,而不是String。 - khriskooper
@khriskooper很高兴听到它:) - geoand


虽然@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) { 
        ...
    }
}

但第一种方法更可取。如果要返回具有自定义内容类型的响应或返回二进制类型(文件等等),则可以使用此方法;


15
2017-10-06 10:21



只是一个抬头,但你甚至不需要为此提取响应。 - Scott
@Scott,为什么不呢? - danny.lesnik
对于第二点,关于需要设置自定义内容类型或返回二进制类型,您仍然可以使用ResponseEntity来实现这些方法。 - Scott


对于那些稍后可能会发现此问题的人来说,这只是一个注释,但您不必拉入响应来更改内容类型。下面是一个例子:

@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);
}

5
2017-10-06 20:49





关于什么:

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

这适合我。


2
2018-01-13 14:30





用于输出 String 如 text/plain 使用:

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

1
2018-01-13 14:36



这对我不起作用。我必须得到响应对象并在返回String对象之前显式设置内容类型。 - Pedro Madrid