我在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类型检查。
任何缺失的步骤?或配置太多?
答案 0 :(得分:1)
在调试我的JsonpAdvice.groovy之后,我发现AbstractJsonpResponseBodyAdvice需要一个String的列表:private final String [] jsonpQueryParamNames;
我的初始代码是使用简单的String。这是修复:
@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
public JsonpAdvice() {
super(["callback"])
}
}