我正在尝试PUT使用jQuery 1.6(Jackson 2.1.1 和Spring 3.2.0 )通过JSON通过该方法向数据库中插入和/或更新数据。
PUT
JS代码如下。
var itemsArray=[]; var id; function insertOrUpdate() { var i=0; $('input[name="txtCharge[]"]').each(function() { isNaN($(this).val())||$(this).val()==''?itemsArray[i][2]='':itemsArray[i][2]=$(this).val(); i++; }); $.ajax({ headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, datatype:"json", type: "PUT", url: "/wagafashion/ajax/InsertZoneCharge.htm", data: "items=" + JSON.stringify(itemsArray)+"&zoneId="+id+"&t="+new Date().getTime(), success: function(response) { alert(response); }, error: function(e) { alert('Error: ' + e); } }); }
通过URL映射的Spring控制器内部的方法如下。
@RequestMapping(value=("ajax/InsertZoneCharge"), method=RequestMethod.PUT, produces=MediaType.APPLICATION_JSON_VALUE) public @ResponseBody String insertZoneCharge(@RequestBody final MultiValueMap<String, String > data, final HttpServletResponse response, HttpServletRequest request) { String message=""; try { Map<String, String> params = data.toSingleValueMap(); if(params.get("zoneId")==null||params.get("zoneId").equals("")||params.get("items")==null||params.get("items").equals("")) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); } else { message=zoneChargeService.insertZoneCharge(params.get("zoneId"), params.get("items")); } } catch (IOException ex) { message="An error occured. Data can not be saved."; Logger.getLogger(ZoneCharge.class.getName()).log(Level.SEVERE, null, ex); } return message; }
服务器按照问题的含义进行响应,
415不支持的媒体类型
标头信息如下所示。
Request URL:http://localhost:8080/wagafashion/ajax/InsertZoneCharge.htm Request Method:PUT Status Code:415 Unsupported Media Type Request Headersview source Accept:application/json Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Connection:keep-alive Content-Length:352 Content-Type:application/json Cookie:JSESSIONID=72AAFCC832C29D14FFA937D00D428A81 Host:localhost:8080 Origin:http://localhost:8080 Referer:http://localhost:8080/wagafashion/admin_side/ZoneCharge.htm User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 X-Requested-With:XMLHttpRequest Request Payload items=[[1,10,"12.35"],[2,10.5,"16.00"],[3,11,"20.00"],[4,11.5,"30.00"],[5,12,"40.00"],[6,12.5,"50.00"],[7,13,"60.00"],[8,13.5,"70.00"],[9,14,""],[10,14.5,""],[11,15,""],[12,15.5,""],[13,16,""],[14,16.5,""],[15,17,""],[16,17.5,""],[17,18,""],[18,18.5,""],[19,19,""],[20,19.5,""],[24,20,""],[25,20.5,""],[26,21,""],[41,21.5,""]]&zoneId=45&t=1359485680332 Response Headersview source Content-Length:1048 Content-Type:text/html;charset=utf-8 Date:Tue, 29 Jan 2013 18:54:40 GMT Server:Apache-Coyote/1.1
整个dispatcher-servlet.xml文件如下。
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <context:component-scan base-package="controller" /> <context:component-scan base-package="validatorbeans" /> <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" > <mvc:message-converters register-defaults="false"> <bean id="jacksonMessageConverter" p:supportedMediaTypes="application/json" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> </mvc:message-converters> </mvc:annotation-driven> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="false" /> <property name="favorParameter" value="false" /> <property name="ignoreAcceptHeader" value="false" /> <property name="mediaTypes" > <value> atom=application/atom+xml html=text/html json=application/json *=*/* </value> </property> </bean> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="index.htm">indexController</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> <bean name="indexController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" p:viewName="index" /> </beans>
当我删除@RequestBody final MultiValueMap<String, String > data一个方法参数并仅用于@PathVariable接受请求参数时,它可以工作。
@RequestBody final MultiValueMap<String, String > data
@PathVariable
浏览器发送的内容类型Content-Type: application/json似乎不匹配@RequestBody final MultiValueMap<String, String > data。
Content-Type: application/json
要么:
发送application/x-www-form-urlencoded(在这种情况下,您可以更轻松地使用HttpPutFormContentFilter代替)。
application/x-www-form-urlencoded
或者:改变这种成像@RequestBody final MyDTO data在解释[了jQuery,Spring MVC的@RequestBody和JSON
@RequestBody final MyDTO data