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

时间:2011-10-06 10:09:43

标签: java spring spring-mvc

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

如果我只是从控制器方法返回一个字符串,那么spring mvc将其视为jsp视图名称。

10 个答案:

答案 0 :(得分:166)

使用@ResponseBody

在控制器中注释您的方法
@RequestMapping(value="/controller", method=GET)
@ResponseBody
public String foo() {
    return "Response!";
}

来自:15.3.2.6 Mapping the response body with the @ResponseBody annotation

  

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

答案 1 :(得分:42)

使用Spring 4,如果您的Controller使用@RestController而不是@Controller进行注释,则不需要@ResponseBody注释。

代码是

@RestController
public class FooController {

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

}

您可以找到@RestController here

的Javadoc

答案 2 :(得分: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) { 
        ...
    }
}

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

怎么样:

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

这适合我。

答案 5 :(得分:2)

要将String输出为text/plain,请使用:

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

答案 6 :(得分:0)

最简单的解决方案:

只需加上引号,我真的不知道为什么当响应类型定义为application / json时,Spring Boot不能自动实现它,但是效果很好。

@PostMapping("/create")
public String foo()
{
    String result = "something"
    return "\"" + result + "\"";
}

答案 7 :(得分:0)

@ResponseBody
@RequestMapping(value="/get-text", produces="text/plain")
public String myMethod() {
     return "Response!";
}
  • 你看到 @ResponseBody 了吗?
<块引用>

这表明该方法返回一些文本而不是解释 将其作为视图等

  • 你看到 produces="text/plain" 了吗?
<块引用>

这只是一个好的做法,因为它告诉我们将从 方法:)

答案 8 :(得分:0)

有两种可能的解决方案

  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
         }
    

答案 9 :(得分:0)

@Controller
public class HelloController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    ResponseEntity<String> sayHello() {
        return ResponseEntity.ok("Hello");
    }
}