【问题标题】:How to set content type dynamically in a Spring MVC controller (depending on presence of request param)?如何在 Spring MVC 控制器中动态设置内容类型(取决于请求参数的存在)?
【发布时间】:2013-05-28 10:37:02
【问题描述】:

我有一个 REST API,直到现在它总是返回 JSONP(JSON 数据包装在客户端想要的任何函数调用中):

static final String JAVASCRIPT = "application/javascript;charset=UTF-8"; 

@RequestMapping(value = "/matches", produces = JAVASCRIPT)
@ResponseBody
public String matches(@RequestParam String callback) {
    String json = jsonService.getCachedJson("/matches");
    return toJsonp(callback, json);
}

现在,事情发生了变化,我需要返回JSON 或 JSONP:如果客户端提供回调函数名称,我们返回 JSONP,否则返回纯 JSON。

关于内容类型,我希望尽可能准确,use application/json for JSON and application/javascript for JSONP

所以,是这样的:

@RequestMapping(value = "/matches")
@ResponseBody
public String matches(@RequestParam(required = false) String callback) {
    String json = jsonService.getCachedJson("/matches");

    // TODO: if callback == null, set content type to "application/json", 
    // otherwise to "application/javascript"

    return jsonOrJsonp(callback, json);
}

String jsonOrJsonp(String callback, String json) {
    return Strings.isNullOrEmpty(callback) ? json : toJsonP(callback, json);
}

看起来我不能再使用@RequestMappingproduces 属性。在上述场景中,使用 Spring MVC 设置内容类型的最简单方法是什么?

如果可能的话,我想避免定义 HttpMessageConverters(或其他 Spring 麻烦)或更改方法返回类型!显然我不喜欢重复的方法声明,其中produces 值是唯一显着的区别。我正在寻找的是对上述代码的最小更改

最新春季(3.2.3)。

【问题讨论】:

    标签: spring-mvc http-headers content-type


    【解决方案1】:

    您是否尝试过仅使用两种请求处理程序方法?

    @RequestMapping(value = "/matches", produces = JAVASCRIPT, params="callback")
    @ResponseBody
    public String Jsonp(@RequestParam String callback) {
        return toJsonp(callback, jsonService.getCachedJson("/matches"));
    }
    
    @RequestMapping(value = "/matches", produces = JSON)
    @ResponseBody
    public String json() {
        return toJson(jsonService.getCachedJson("/matches"));
    }
    

    带有params 参数的第一个方法将只映射到存在callback 参数的请求。

    【讨论】:

    • 当然,这是可能的,但不是很优雅。正如我在问题中所写:“显然我不喜欢重复的方法声明,其中 produces 值是唯一显着的区别。”
    • 抱歉,我没看清楚你的帖子。查看this postthis post。希望这些更有帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 2015-08-18
    • 2011-11-10
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2018-05-26
    相关资源
    最近更新 更多