Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 4:MappingJackson2HttpMessageConverter不支持jsonp的应用程序/javascript_Java_Spring_Spring Mvc_Jsonp_Spring 4 - Fatal编程技术网

Spring 4:MappingJackson2HttpMessageConverter不支持jsonp的应用程序/javascript

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/

使用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/info/1?formatType=xml
    
  • 点击下面的URL会出现406异常

     /contextRoot/info/1?formatType=jsonp&param1=callback1
    
  • 观察结果

    在做调查时,发现MappingJackson2HttpMessageConverter 不支持应用程序/javascript

    对此感到惊讶,因为Spring4声称支持JSONP开箱即用

    此外,MappingJackson2JsonView确实支持JSONP开箱即用

    问题

    我是否在配置中遗漏了一些东西,这些配置一旦添加,将使我能够使用Spring4forJSONP的内容类型应用程序/javascript开箱即用

    编辑

    这是我的ControllerAdvice配置:

    <bean id="jsonpAdvice"
        class="com.advice.AccountServiceControllerJsonpAdvice">
        <constructor-arg ref="jsonpParameterNames" />
    </bean>
    
    <mvc:annotation-driven/>
    
    然而,这并不能使我的应用程序理解下面这样的URL并返回406错误

       /contextRoot/info/1?formatType=jsonp&param1=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