【问题标题】:Sending custom Content-Type with ResponseEntity<Resource>使用 ResponseEntity<Resource> 发送自定义 Content-Type
【发布时间】:2011-09-05 03:47:34
【问题描述】:

我正在尝试在我的 Spring WebMVC 3.0.5 控制器中使用 ResponseEntity 返回类型。我正在返回一张图片,所以我想使用以下代码将 Content Type 设置为 image/gif:

@RequestMapping(value="/*.gif")
public ResponseEntity<Resource> sendGif() throws FileNotFoundException {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.IMAGE_GIF);
    return new ResponseEntity<Resource>(ctx.getResource("/images/space.gif"), headers, HttpStatus.OK);
}

但是,ResourceHttpMessageConverter 中的返回类型被覆盖为 text/html。

除了实现我自己的 HttpMessageConverter 并将其注入 AnnotationMethodHandlerAdapter 之外,我还有什么方法可以强制 Content-Type 吗?

【问题讨论】:

    标签: spring spring-mvc mime-types content-type


    【解决方案1】:

    这应该是设置所有参数的方法,例如 httpStatus , contentType 和 body

    ResponseEntity.status(status).contentType(MediaType.APPLICATION_JSON).body(response);

    此示例使用 ResponseEntity.BodyBuilder 接口。

    【讨论】:

      【解决方案2】:

      这两种方法都是正确的。你也可以使用 ResponseEntity&lt;?&gt; 在顶部,以便您可以发送多种类型的数据。

      【讨论】:

        【解决方案3】:

        另一个命题:

        return ResponseEntity
                          .ok()
                          .contentType(MediaType.IMAGE_GIF)
                          .body(resource);
        

        【讨论】:

        • 这比直接在 HttpServletResponse 中设置要干净得多。
        【解决方案4】:

        尝试注入 HttpServletResponse 对象并从那里强制内容类型。

         @RequestMapping(value="/*.gif") 
         public ResponseEntity<Resource> sendGif(final HttpServletResponse response) throws FileNotFoundException {
                    HttpHeaders headers = new HttpHeaders();
                    headers.setContentType(MediaType.IMAGE_GIF);
                    response.setContentType("image/gif"); // set the content type
                    return new ResponseEntity<Resource>(ctx.getResource("/images/space.gif"), headers, HttpStatus.OK);
                }
        

        【讨论】:

        • 谢谢 gouki,我很确定这会奏效。但是,我应该提前补充一下,这是实现与 servlet API 解耦的春天梦想的练习。通常在这种情况下,我让 spring 传入 HttpServletResponse 并直接写入响应输出流。还是谢谢你。
        • 这太棒了。它对我有用 100%。请注意 response.setContentType("image/gif");线什么也不做。关键在于其余部分。
        • 当您使用此技术时,您可能会收到 406 错误,在我的情况下解决的问题是返回 ResponseEntity 作为stackoverflow.com/questions/8049153/… 下面的 SO 答案
        • @gouki 是否也需要设置标题或仅设置 response.setContentType("image/gif");够好了?他们有什么区别或需要?
        猜你喜欢
        • 2011-11-12
        • 2019-08-05
        • 1970-01-01
        • 2012-01-30
        • 2013-11-06
        • 1970-01-01
        • 2014-11-11
        • 2013-09-02
        相关资源
        最近更新 更多