Spring 4:MappingJackson2HttpMessageConverter不支持jsonp的应用程序/javascript
使用Spring 4.1.6.RELEASE和Jackson库v2.5.4 希望使用Spring4在我的REST服务中使用JSONP; Spring4支持JSONP开箱即用 配置Spring 4:MappingJackson2HttpMessageConverter不支持jsonp的应用程序/javascript,java,spring,spring-mvc,jsonp,spring-4,Java,Spring,Spring Mvc,Jsonp,Spring 4,使用Spring 4.1.6.RELEASE和Jackson库v2.5.4 希望使用Spring4在我的REST服务中使用JSONP; Spring4支持JSONP开箱即用 配置 <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"> ... </mvc:annotation-driven> 点击以下URL将以XML格式提供数据 /contextRoot/
<mvc:annotation-driven
content-negotiation-manager="contentNegotiationManager">
...
</mvc:annotation-driven>
/contextRoot/info/1?formatType=xml
/contextRoot/info/1?formatType=jsonp¶m1=callback1
<bean id="jsonpAdvice"
class="com.advice.AccountServiceControllerJsonpAdvice">
<constructor-arg ref="jsonpParameterNames" />
</bean>
<mvc:annotation-driven/>
然而,这并不能使我的应用程序理解下面这样的URL并返回406错误
/contextRoot/info/1?formatType=jsonp¶m1=callback1
它只会让我的应用程序理解如下请求URL并返回JSONP响应:
/contextRoot/info/1?param1=callback1
是的,Spring4.1+支持JSONP,但它本身不是一种转换格式
MappingJackson2HttpMessageConverter
支持“应用程序/json”
和“*+json”
媒体类型,但不支持“应用程序/javascript”
。如果它这样做了,那么您会期望它解析javascript代码,而事实并非如此
在这里,我们只是包装输出,使其“application/javascript”
,但实际上,它仍然是JSON
您当前的配置正在禁用使用HTTP接受头的内容协商(为什么?)。为了支持JSONP,您只需要在MVC配置中使用:
<bean id="jsonpAdvice"
class="com.advice.AccountServiceControllerJsonpAdvice">
<constructor-arg ref="jsonpParameterNames" />
</bean>
<mvc:annotation-driven/>
就这样
现在您将获得:
GET /contextRoot/info/1
// will return what's best depending on the Accept header sent by the client
GET /contextRoot/info/1.xml
// will return XML
GET /contextRoot/info/1.json
// will return JSON
GET /contextRoot/info/1.json?callback=myFunction
// will return JSONP wrapped in a "myFunction" call
在您的情况下,您应该:
“application/javascript”
,或者为了向后兼容,将“jsonp”
与“application/json”
媒体类型关联GET/contextRoot/info/1?formatType=json¶m1=callback1
有关实现的更多详细信息,请参阅。嗨,Brian,我也在使用controllerAdvice。但是,它仅在URL类似于:/contextRoot/info/1?param1=callback1时才支持JSONP。相反,我希望URL的格式为:/contextRoot/info/1?formatType=JSONP¶m1=callback1;当我们打算使用JSONP格式时,难道我们不打算隐式地使用application/javascript媒体类型吗?甚至MappingJackson2JsonView也可以使用application/javascript。那么,为什么要启用它来处理Javascript代码呢?转换器应该能够读/写内容-Jackson无法解析Javascript源代码。。。MappingJackson2JsonView也是一个单向过程:写入,而不是读取。JSONP只支持GET请求,不支持PUT。因此,GET请求不能发送任何数据(同样是JSONP格式)。那么,您需要如何解析应用程序/javascript或JSONP数据呢?有没有可能出现这样一种场景:请求本身是JSONP格式的?让我也向我解释一下这一点的重要性:我们正在迁移到Spring4,在我们有JSONP支持的自定义实现之前。我们使用的URL格式是--“contextRoot/info/12?format=jsonp&callback=value”----在迁移到Spring4时,我们需要保持RESTURL的向后兼容性。
/contextRoot/info/1?param1=callback1
<mvc:annotation-driven/>
@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
public JsonpAdvice() {
super("callback");
}
}
GET /contextRoot/info/1
// will return what's best depending on the Accept header sent by the client
GET /contextRoot/info/1.xml
// will return XML
GET /contextRoot/info/1.json
// will return JSON
GET /contextRoot/info/1.json?callback=myFunction
// will return JSONP wrapped in a "myFunction" call