【问题标题】:JSON to Spring ControllerJSON 到 Spring 控制器
【发布时间】:2014-09-05 05:19:06
【问题描述】:

我想将带有表单标签值的 json 发送到 Spring MVC 控制器。

提交方法上的表单执行以下代码

var jsonStr = JSON.stringify($("#form1").serializeArray());  
    $.ajax({
        url :  "/DMS/webcontroller/startupload",
        type : "POST",
       // traditional : true,
        contentType : "application/json; charset=utf-8",
        processData:false,
        //dataType : "json",
        data : jsonStr,
        success : function (response) {
            alert('success ' + response);
        },
        error : function (response) {
            alert('error ' + response);
        },
    });

我已将以下内容添加到我的 spring 配置 xml

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonMessageConverter"/>
            </list>
        </property>
    </bean>

    <!-- Configure bean to convert JSON to POJO and vice versa -->
    <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
     <property name="prefixJson" value="false"/>
        <property name="supportedMediaTypes" value="application/json"/>
    </bean>   

我的控制器签名如下

@RequestMapping(value="/startupload", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody ReturnData startUpload(@RequestBody UploadStartVO startVO)
        {...

当我使用 firefox 31 在 tomcat 7 上运行此程序时,我收到 415 响应。如果我使用工具检查请求,我发现 Content-Type 已添加到请求正文中。还有 请求数据的查询格式如下:

supplierId=1111&unregSupplier=unregSupplier&customerName=customerName&externalEntity=externalentity&application=scms&logicalGroup=demand&user=u1&password=u1&appUser=appu1&documentType=email&documentDescription=documentDescription&contactPerson=contactPerson&contactNumber=contactNumber&documentGroupName=demand&documentPurpose=documentpurpose&uploaderIP=uploaderIp&uploaderName=scmsname&uploaderCompletePath=somepath%2Fsomepath&uploadDateTime=20%2F12%2F2014

不是这样的:

[{"name":"supplierId","value":"1111"},{"name":"unregSupplier","value":"unregSupplier"},{"name":"customerName","value":"customerName"},{"name":"externalEntity","value":"externalentity"},{"name":"application","value":"scms"},{"name":"logicalGroup","value":"demand"},{"name":"user","value":"u1"},{"name":"password","value":"u1"},{"name":"appUser","value":"appu1"},{"name":"documentType","value":"email"},{"name":"documentDescription","value":"documentDescription"},{"name":"contactPerson","value":"contactPerson"},{"name":"contactNumber","value":"contactNumber"},{"name":"documentGroupName","value":"demand"},{"name":"documentPurpose","value":"documentpurpose"},{"name":"uploaderIP","value":"uploaderIp"},{"name":"uploaderName","value":"scmsname"},{"name":"uploaderCompletePath","value":"somepath/somepath"},{"name":"uploadDateTime","value":"20/12/2014"}]

请求正文显示:

Content-Type: application/x-www-form-urlencoded
Content-Length: 457

请求头显示

Host: localhost:8082
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:8082/DMS/
Cookie: JSESSIONID=C64F21EEECFC5BDF515C3DE22F51626A
Connection: keep-alive

如果我编辑此请求并将 json(这是调试期间在 jsonStr var 中看到的内容)放入请求正文中,请更改正文中的 Content-Type 并在标头中添加 Content-Type,我得到 400错误的请求!!

请帮帮我!

编辑:: 所以主要问题是 $.ajax() 没有创建正确的请求。数据不是 json,contenttype 不是 application/json。

编辑:: 忘记粘贴 pom.xml 依赖项

 <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.databind-version}</version>
        </dependency>

编辑::: 我尝试删除转换后的对象 UploadStartVO 和 ReturnData 并替换为 String 对象的代码。调用成功,ajax() 方法仍然返回异常,但表单标记具有正确适用于我的控制器方法的 action 属性。谁能指出为什么ajax调用不起作用?火狐31

【问题讨论】:

  • 如果对你有帮助,请尝试我的回答
  • 你用的是哪个版本的spring?
  • 4.0.2.RELEASE.jackson 2.3.3

标签: json spring-mvc


【解决方案1】:

似乎我以错误的格式向控制器发送数据。我试着一一改变一切。 不需要控制器标头headers = {"Content-type=application/json"}

不需要控制器中的consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE

我将杰克逊版本从 2.3.3 降级到 1.9.1。那没有效果。

我最初发送的数据是

 JSON.stringify({'key': 'John', 'application': 'SCMS'})

改成后

JSON.stringify({key: 'John', application: 'SCMS'})

Request 未正确转换为 POJO。

希望这可以节省一些时间!

【讨论】:

    【解决方案2】:

    在 Spring MVC 中,要输出 JSON 数据,您必须在项目类路径中添加 Jackson library

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.9</version>
    </dependency>
    
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.9</version>
    </dependency>
    

    【讨论】:

    • 已添加依赖但未粘贴 pom.. 版本为 2.3.3
    • @kavita 尝试删除consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE@RequestBody 就足够了
    【解决方案3】:

    下面试试

    如果仍然无效,请尝试以下几点。

    1.) 尝试评论/取消评论 contentTypedataType 的组合。

    2.) 也可以尝试使用 'data : JSON.stringify(jsonStr),'。

    3.) 同时尝试提醒您的数据。

    var jsonStr = $("#form1").serialize();  
        $.ajax({
            url :  "/DMS/webcontroller/startupload",
            type : "POST",
            contentType : "application/json",
            data : JSON.stringify(jsonStr),
            success : function (response) {
                alert('success ' + response);
            },
            error : function (response) {
                alert('error ' + response);
            },
        });
    

    【讨论】:

    • 三个都完成了!警报是我在调试中看到的。数据值中的 stringify 仍然给出错误。我还在编辑请求中添加了 contenttype 标头。
    • 在请求之前...是的。我已经把它粘贴到我的q中了
    【解决方案4】:

    尝试将代码 consumes=MediaType.APPLICATION_JSON_VALUE 更改为 consumes="application/json" 如果它也给响应带来错误,则对生产执行相同的操作。 最后,如果它不起作用,请尝试删除客户端代码,在标头声明中删除字符集编码,只留下 application/json 声明。

    希望这会有所帮助。

    干杯。

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 2012-10-03
      • 2012-09-09
      • 2012-01-29
      • 2012-06-16
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多