2012-10-20 36 views
6

Khi gửi yêu cầu JSON đến máy chủ, tôi thường được chào đón bởi tin nhắn này:Spring MVC: Yêu cầu gửi của khách hàng là không chính xác cú pháp

Yêu cầu gửi của khách hàng là không chính xác cú pháp().

Thông thường đó là thuộc tính không đúng được thông qua mà trình điều khiển không mong đợi, vì đối tượng JSON ánh xạ không chứa nó.

Tìm tham số không cần tốn nhiều thời gian - có cách nào để nhận thêm thông tin, có lẽ ngay cả một dấu vết ngăn xếp của ngoại lệ? Tôi đã thử chạy trong chế độ gỡ lỗi và tôi đang sử dụng Jackson làm trình tuần tự JSON (de) của tôi.

+2

Hãy thử thay đổi cấp độ đăng nhập (giả sử bạn đang sử dụng log4j hoặc equiv.) Của 'org.springframework' thành' DEBUG'. – nickdos

+0

@nickdos cheers, sẽ thử –

+1

Lỗi * Yêu cầu do khách hàng gửi không chính xác về cú pháp "** trong hầu hết trường hợp có nghĩa là jackson không thể khử muối (chuyển đổi chuỗi json thành đối tượng) vì hàm tạo mặc định bị thiếu. Trong trường hợp của bạn là thiếu constructor mặc định, bạn có constructor tham số mà ghi đè mặc định và jackson là không thể tạo đối tượng – abosancic

Trả lời

6

Nếu dữ liệu mà tiêu thụ của bạn là từ một api bên ngoài và nếu bạn muốn bảo vệ điều khiển của bạn từ các yếu tố không cần thiết/tài sản mà bạn không cần phải bạn có thể sử dụng bên dưới chú thích trên lớp POJO

@JsonIgnoreProperties(ignoreUnknown = true) 

hoặc bạn có thể đặt nó trên toàn cầu

//jackson 2.0 
jsonObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
+0

@Aram Kocharyan bạn đã thử này – Sudhakar

+0

@JsonIgnoreProperties (ignoreUnknown = true) Làm việc cho tôi –

+1

Lỗi * Yêu cầu được gửi bởi máy khách là cú pháp không chính xác "** trong hầu hết trường hợp có nghĩa là jackson không thể khử muối (chuyển đổi chuỗi json thành đối tượng) vì hàm khởi tạo mặc định bị thiếu. – abosancic

3

Cũ trường hợp, tôi không liên quan đến bây giờ, nhưng đối với những người khác có sự cố tương tự, tôi sẽ thêm mục này.

Kiểm tra xem bạn có dấu ngoặc kép hay không, không phải dấu nháy đơn. Ngoài ra hãy thử thoát chúng.

Tôi đã sử dụng ứng dụng curl cho các yêu cầu json thử nghiệm của mình.

JSON của tôi là như thế này

{ 'name' : 'somedata', 'town':'some town' } 

và nó chỉ cần thổi lên trong mắt tôi.

"Yêu cầu do khách hàng gửi không chính xác cú pháp" là lỗi chung. Vì vậy, tôi đã thay đổi nó từ dấu nháy đơn thành dấu nháy kép, không đi. Sau đó tôi đã cố gắng có một dấu gạch chéo ngược trước dấu nháy đơn, vẫn không đi. Sau đó thay đổi nó thành dấu gạch chéo ngược trước dấu ngoặc kép và mau!

curl -i -H "Accept: application/json" -H "Content-Type: application/json" \ 
http://localhost:8077/dra/dump.json \ 
-X PUT -d "{\"name\" : \"My Name\", \"town\":\"My Town\"}" 
+0

Hầu hết các ví dụ đang sử dụng '-d '{" x ":" y "} '', trên Windows nó không hoạt động, và tôi đã phải sử dụng theo cách của bạn để làm cho nó hoạt động. Thx để đăng bài. – Sydney

8

Để biết thêm thông tin/stack trace bật debug logging cho web mùa xuân trong log4j.properties

log4j.logger.org.springframework.web = debug

+0

Cảm ơn bạn rất nhiều, đây là những gì tôi đang tìm kiếm (y) – webmaster

0

tôi phải đối mặt với cùng một lỗi kể từ vài ngày, cuối cùng đã bật tính năng ghi nhật ký gỡ lỗi như được đề cập bởi @Farm và có thể thấy nguyên nhân của sự cố này. Tôi đã có một đối tượng Person được đăng trong json từ jsp để mùa xuân điều khiển như hình dưới đây: -

@RequestMapping(value = "/get", method = RequestMethod.POST) 
public @ResponseBody 
Person getPerson(@RequestBody Person person) { 
    // System.out.println("inside get::::::::"); 
    System.out.println("city:=" + person.getResidenceAddress().getCity()+" " 
      + "name:= " + person.getFullName().getFirstName()); 
    // Person prsn = personService.getPerson(person); 

    /* 
    * Person prsn = new Person(); prsn.setId(1); ResponseDecorator rd = new 
    * ResponseDecorator(prsn, true); 
    */return person; 
} 
// Person Object 
class Person{ 
private Name fullName; 
private Address residenceAddress; 
private Address mailingAddress; 
private Gender gender; 
private MaritalStatus maritalStatus; 
private Integer creditRating; 

} 

//Address Object 
public class Address { 
private String streetNo; 
private String streetName; 
private String suburb; 
private String city; 
private String state; 
private String country; 
private Integer pinCode; 
private AddressType addressType; 
} 


json post from jsp:- 
//create JSON 
var json = { 
"id": id, 
     "fullName":{"firstName":firstName,"middleName":middleName,"surName":  surName}, 
"residenceAddress":{ "streetNo": streetNo, 
         "streetName": streetName, 
         "suburb": suburb, 
         "city": city, 
         "state": state, 
         "country": country, 
         "pinCode": pincode 
         } 
     }; 

var dataString = JSON.stringify(json); 
//alert(dataString); 


$.ajax({ 
    headers: { 
     Accept : "text/plain; charset=utf-8, application/json"}, 
    url: "/myservice/get", 
    type: 'POST', 
    dataType: 'json', 
    //data : "{  }", 
    data: dataString, 
    contentType: 'application/json', 
    mimeType: 'application/json', 
    success: function(data) { 
     alert(data); 
    }, 
    error:function(data,status,er) { 
     alert("error: "+data+" status: "+status+" er:"+er); 
    } 
}); 

Các lỗi trên trình là 400 Bad yêu cầu và không có đầu mối khác là tại sao nó đã thất bại. On cho phép chế độ gỡ lỗi trên máy chủ, tôi có thể thấy dưới đây lỗi stack trace: -

**00:53:42,294 DEBUG RequestResponseBodyMethodProcessor:117 - Reading [com.foo.assignment.model.Person] as "application/json" using [org.springf[email protected]1813fb] 
00:53:42,310 DEBUG ServletInvocableHandlerMethod:159 - Error resolving argument [0] [type=com.foo.assignment.model.Person] 
HandlerMethod details: 
Controller [com.foo.assignment.controller.PersonController] 
Method [public com.foo.assignment.model.Person com.foo.assignment.controller.PersonController.getPerson(com.foo.assignment.model.Person)] 
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: No suitable constructor found for type [simple type, class com.foo.assignment.model.Address]: can not instantiate from JSON object (need to add/enable type information?) 
at [Source: [email protected]; line: 1, column: 98] (through reference chain: com.foo.assignment.model.Person["residenceAddress"]); nested exception is org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.foo.assignment.model.Address]: can not instantiate from JSON object (need to add/enable type information?) 
at [Source: [email protected]; line: 1, column: 98] (through reference chain: com.foo.assignment.model.Person["residenceAddress"]) 
    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:74) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155) 
    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:900) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
    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:650) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.foo.assignment.model.Address]: can not instantiate from JSON object (need to add/enable type information?) 
at [Source: [email protected]; line: 1, column: 98] (through reference chain: com.foo.assignment.model.Person["residenceAddress"]) 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:746) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:683) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 
    at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1923) 
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:124) 
    ... 37 more 
00:53:42,310 DEBUG ExceptionHandlerException** 

Thêm một constructor mặc định trong đối tượng Địa chỉ giải quyết được lỗi. Và sử dụng tiện ích bổ sung của Google Postman (plugin https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en) thực sự giúp kiểm tra các thay đổi của tôi khá nhanh.

0

Sự cố xảy ra với POJO của bạn, giữ cấp nhật ký máy chủ ở cấp Gỡ lỗi và kiểm tra lỗi. Điều này sẽ chủ yếu liên quan đến một số trường và loại trường không phù hợp.

+0

Chào mừng bạn đến với StackOverflow. Bạn phải chi tiết hơn phản hồi của bạn để giúp đỡ nhiều hơn về vấn đề của người dùng. – darkomen

0

Lỗi này cũng có thể xảy ra khi sử dụng các lớp lồng nhau ví dụ:

class One { 
    some code.. 

    public class NestedOne { 
     private attr; 

     public NestedOne() { 
      // default constructor 
     } 
    } 
} 

và sau đó có @RequestMapping(value = "/something") public String someControllerMethod(@RequestBody One.NestedOne nested) { ... }

jackson sau đó không nhận NestedOne() như constructor mặc định và tìm kiếm One.NestedOne() constructor.

Các vấn đề liên quan