[英]SpringMVC sending JSON data to the server (java)
我有一個javascript數組,我填充數組結構的元素:
var citizens1 = [{"startLat":null,"startLng":null,"socialSecurityNumber":null}];
數組獲取數據,但我需要將此數據推送到服務器進行處理。 該陣列擁有500條記錄 。 而不是向服務器發出500 Web服務請求我將數組數據轉換為JSON字符串並將所有數據傳遞到服務器,我立即處理所有記錄,從而進行一次ajax調用 。
我不確定我是否正確地將數據傳遞給服務器。 我遇到了錯誤。 下面是我的代碼:
使用Javascript
citizens1.push({startLat:marker[index].getPosition().lat(),startLng:marker[index].getPosition().lng(),socialSecurityNumber:global_citizens[index].socialSecurityNumber});
if(citizens1.length == 500){
console.log('500 records saved');
window.clearTimeout( timerHandle);
for(var i = 0; i < citizens1.length ; i++){
var myJsonString = JSON.stringify(citizens1);
//console.log(myJsonString);
//console.log(citizens1[i].lat +',' +citizens1[i].lng+','+citizens1[i].socialSecurityNumber);
$.ajax({
type:'POST',
url:'logMovement.htm',
contentType: "application/json; charset=utf-8",
async: false,
cache: false,
data:myJsonString,
dataType: 'json',
success:function(data){
if (data == false){
console.log('error occured in logging data');
}
}
});
}
citizens1 = [];
}
調節器
@RequestMapping(value="logMovement.htm", method={RequestMethod.POST},produces = "application/json; charset=utf-8")
public @ResponseBody Movement logMovement(@RequestBody Movement movement)throws Exception{
logger.info("About to log movement");
JSONObject jsonObj = JSONObject.fromObject(movement);
ObjectMapper mapper = new ObjectMapper();
List<Movement> move = mapper.readValue(jsonObj.toString(), new TypeReference<Movement>(){});
logger.info(move);
return null;
/*if((!lat.equals(null)) || (!(lat == null)) || (!(lat.length() == 0))){
double dLat = Double.parseDouble(lat);
double dLng = Double.parseDouble(lng);
int iSocialSecurityNumber = Integer.parseInt(socialSecurityNumber);
this.markerManager.logMovement(dLat, dLng, iSocialSecurityNumber);
}*/
}
運動課
public class Movement implements Serializable{
private List<Integer>socialSecurityNumber;
private List<Double> startLat;
private List<Double> startLng;
/**
* @param socialSecurityNumber
* @param startLat
* @param startLng
*/
public Movement(){}
public Movement(List<Integer> socialSecurityNumber, List<Double> startLat,
List<Double> startLng) {
super();
this.socialSecurityNumber = socialSecurityNumber;
this.startLat = startLat;
this.startLng = startLng;
}
//getters and setters
發布到服務器的Json數據示例
我看到第一行是'null'我不確定這是否導致問題
[{ “startLat”:NULL, “startLng”:NULL, “socialSecurityNumber的” 日期null},{ “startLat”:10.537749449700717 “startLng”: - 61.44420048947677, “socialSecurityNumber的”:198501012},{ “startLat”:10.537208514171011” startLng “: - 61.443589321013235” socialSecurityNumber的 “:198501012},{” startLat “:10.536667622323245” startLng “: - 61.44297811322531,” socialSecurityNumber的 “:198501012},{” startLat “:10.536131483465244” startLng “: - 61.442362603115384” socialSecurityNumber的“:198501012},{” startLat “:10.53566878133931,” startLng “: - 61.44168979108997,” socialSecurityNumber的 “:198501012},{” startLat “:10.535227295591238” startLng “: - 61.441000943386825” socialSecurityNumber的 “:198501012},{” startLat “:10.170058041417015,” startLng “: - 61.67893982108137,” socialSecurityNumber的“:194302025}
錯誤
我看着這太問題,其處理這個問題必需的JSON參數不存在在jQuery的數據表
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.crimetrack.business.Movement out of START_ARRAY token
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.crimetrack.business.Movement out of START_ARRAY token
at [Source: org.apache.catalina.connector.CoyoteInputStream@72f1db9d; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.crimetrack.business.Movement out of START_ARRAY token
at [Source: org.apache.catalina.connector.CoyoteInputStream@72f1db9d; line: 1, column: 1]
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:127)
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:120)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:91)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:71)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.crimetrack.business.Movement out of START_ARRAY token
at [Source: org.apache.catalina.connector.CoyoteInputStream@72f1db9d; line: 1, column: 1]
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:159)
at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:131)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeUsingCreator(BeanDeserializer.java:397)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:296)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1282)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:941)
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:124)
... 33 more
您的JSON無效,冒號左側的值必須是字符串。
[
{
"lat": null,
"lng": null,
"socialSecurityNumber": null
}
]
此外,您似乎使用了錯誤的注釋,@ @RequestBody
用於解析JSON的內容而不是@RequestParam
,用於從參數中獲取變量
?var=1&newvar=2
此外,在您的javascript中, change data:{'myData':myJsonString }
更改為data:myJsonString,
你應該制作一個愚蠢的對象來填充,在頁面底部查看這個教程,它們填充一個愚蠢的Person對象hmkcode.com/spring-mvc-json-json-to-java
你可以像這樣在控制器中寫響應
希望這會“有所幫助
//get "hie" string from the service class, String is in JSON format
String hie = svc.getHierarchysvc();
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.write(hie);
我對機芯類和控制器進行了一些調整,這為我提供了解決方案。 Under是可能有興趣解決此錯誤的人的代碼:
Movement.java
擁有默認構造函數非常重要。 如果這不存在,json將拋出與application / json相關的錯誤; charset = utf-8不支持http 415不支持的媒體。
public class Movement implements Serializable{
private int socialSecurityNumber;
private double startLat;
private double startLng;
/**
* @param socialSecurityNumber
* @param startLat
* @param startLng
*/
public Movement(){}
/**
* @param socialSecurityNumber
* @param startLat
* @param startLng
*/
public Movement(int socialSecurityNumber, double startLat, double startLng) {
super();
this.socialSecurityNumber = socialSecurityNumber;
this.startLat = startLat;
this.startLng = startLng;
}
//getters and setters
調節器
由於它是一個數據數組,因此定義@RequestBody
以使用List非常重要。 同時聲明JSONArray對於保存列表很重要。 完成后,您可以根據其類型“獲取”數據。 下面是代碼。
@RequestMapping(value="logMovement.htm", method = {RequestMethod.POST},consumes = "application/json")
public @ResponseBody Movement logMovement(@RequestBody List<Movement> movement)throws Exception{
logger.info("About to log movement");
JSONArray nameArray =(JSONArray) JSONSerializer.toJSON(movement);
System.out.println(nameArray.size());
for(Object js : nameArray){
JSONObject json = (JSONObject)js;
//System.out.println(json.get("socialSecurityNumber"));
if((!json.get("startLat").equals(null))){
this.markerManager.logMovement(json.getDouble("startLat"),json.getDouble("startLng"), json.getInt("socialSecurityNumber"));
}
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.