Spring Boot JSONP带有MappingJacksonValue响应和严格的MIME类型错误

时间:2016-12-16 21:11:33

标签: json spring spring-mvc spring-boot jsonp

我在Spring 4上已经阅读了很多关于JSONP支持的内容,但是我仍然缺乏一个干净的解释来使它适用于正确的媒体类型(在chrome下)

1)我添加了JsonpAdvice cfr Jackson JSONP Support

@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
    public JsonpAdvice() {
        super("callback");
    }
}

2)我的控制器使用MappingJacksonValue *

包装响应
@RequestMapping(value = '/api/test', method = RequestMethod.GET)
@ResponseBody
public Object test(HttpServletRequest request) {
    List<String> result = new ArrayList<String>();
    result.add("hello");
    result.add("world");
    if(request.getParameter('callback')){
        MappingJacksonValue value = new MappingJacksonValue(result)
        value.setJsonpFunction(request.getParameter('callback'))
        return value
    }
    return result
}

不确定MappingJacksonValue是否必要或者MappingJackson2HttpMessageConverter是否会处理这个问题?

3)我在application.yml 中添加了明确的媒体类型:

spring:
  profiles.active: development
  jackson.property-naming-strategy: SNAKE_CASE
  mvc:
    media-types:
      json: 'application/json'
      xml:  'application/xml'
      jsonp: 'application/javascript'

但是我仍然在Chrome中遇到以下错误

  

拒绝执行来自&#39; https://example.com/api/test?callback=jQuery22406993800323428312_1481922214995&_=1481922214996&#39;的脚本   因为它的MIME类型(&#39; application / json&#39;)不可执行,并且启用了严格的MIME类型检查。

任何缺失的步骤?或配置太多?

1 个答案:

答案 0 :(得分:1)

在调试我的JsonpAdvice.groovy之后,我发现AbstractJsonpResponseBodyAdvice需要一个String的列表:private final String [] jsonpQueryParamNames;

我的初始代码是使用简单的String。这是修复:

@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
    public JsonpAdvice() {
        super(["callback"])
    }
}