我想知道为什么spring boot为不同的请求将相同的响应对象注入到我的控制器方法参数中,我按如下方式使用它:
@Controller
@Slf4j
@Profile("default")
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
@ResponseBody
public void getDeviceImage(@RequestParam("serialNumber") String serialNumber, HttpServletResponse response) {
return balabala;
}
}
我在返回命令之前添加了一个断点,并且发现响应对象的地址对于不同的请求是相同的。
我想写一些东西到response.getOutputStream(),我发现以前存在缓冲数据。
答案 0 :(得分:0)
HttpServletResponse
。默认情况下,即使您未在参数中指定HttpServletResponse
,在典型的MVC中,模型也会添加到传播到视图之前的新构造响应。
如果您只需要返回一些响应,例如模型或实体或简单的JSON,则不必手动弄乱HttpServletResponse
。除非您想浏览Cookie或标题等。在您的代码中,如果您不需要关心这一点,则可能不需要它。
根据HttpServletResponse
的API文档:
servlet容器创建一个HttpServletResponse对象并传递 它作为servlet服务方法(doGet,doPost, 等)。
您看到的可能是Spring设置的默认配置。
使用@ResponseBody
,将返回类型直接写回响应。
https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody
答案 1 :(得分:0)
最后,我发现Response将一直被重用,并且将为每个请求(org.apache.catalina.connector.Response#recycle)调用Response的回收方法。 但是默认情况下,facade&outputStream&writer不会被清除,因此在该问题消失之后,我将系统属性“ org.apache.catalina.connector.RECYCLE_FACADES”设置为“ true”。