【发布时间】: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