在Spring Boot控制器方法中传递HttpServletResponse

时间:2018-11-03 19:22:17

标签: java spring-boot

在传递了HttpServletResponse的spring boot代码片段中,在控制器方法中有一个参数

public void someApiMethod(@RequestBody MyRequest req, HttpServletResponse response) {
    //some code
    response.setStatus(HttpStatus.NO_CONTENT.value());   
} 

使用ResponseEntity可以达到相同的效果,我觉得这里不需要传递HttpServletResponse。请告知哪种方法是最佳方法,为什么要考虑此代码是为rest API编写的?

4 个答案:

答案 0 :(得分:1)

更好的解决方案是使用@ResponseStatus,因为没有真正的理由在控制器方法中添加非API参数,例如HttpServletResponseResponseEntity。在大多数情况下,仅路径变量,请求参数,请求正文和标头应为控制器参数集。另外,它更具可读性,可维护性,并且仍可由Swagger等使用。

@ResponseStatus(code = HttpStatus.NO_CONTENT)
public void someApiMethod(@RequestBody MyRequest req) {
    //some code
}

答案 1 :(得分:1)

这取决于您的特定用例。

  • 如果您可以在不直接访问HttpServletResponse对象的情况下实现用例,请以任何方式进行。这是更清洁的方法。
  • 您可能有一种需要 访问HttpServletResponse的情况。这样的例子就是您需要将内容 流回客户端的时候,因此您需要直接访问响应输出流。在最新版本的Spring中,也可以通过StreamingResponseBody来实现,从而避免了直接访问响应输出流的需求。

答案 2 :(得分:1)

Spring引导(特别是在这种情况下,Spring MVC是Spring引导的一部分)提供了对Servlet规范一部分的低级HttpResponse的抽象。

简而言之,这种抽象使您无需考虑Http协议,而可以专注于业务逻辑,这是一件好事。

因此,如果您可以避免使用HttpServletResponse-一定要这样做(这是您在应用程序中通常要做的事情)。 您可以创建对象(如果使用REST,spring会为您转换对象),您可以返回ResponseEntity,即“ status” +“ body”,spring会进行所有转换。

因此,请首先考虑这些技术。

现在,有时您必须在较低级别上处理响应,在这种情况下,您必须使用HttpServletResponse对象。

如果要返回无法轻松转换的二进制数据,请参见此示例。例如,如果您要准备一个zip文件并作为HTTP请求的结果发送回去,则必须获得更细粒度的低级控件,在这种情况下,最好从HttpServletResponse参数开始传递给控制器​​方法。

答案 3 :(得分:0)

我认为,返回一个ResponseEntity并根据您的可疑使用它是一种更好的方法。 ResponseEntity更易于处理,更“优雅”的解决方案,与Spring设计更加一致。