6

サーバーにJSONリクエストを送信すると、次のメッセージが表示されることがよくあります。

クライアントから送信された要求は構文的に正しくありませんでした()。

通常、JSONがマップするオブジェクトには属性が含まれていないため、コントローラーが予期していなかったのは誤った属性です。

パラメータを見つけるのに不必要に時間がかかります-おそらく例外のスタックトレースでさえ、より多くの情報を取得する方法はありますか?デバッグモードで実行してみましたが、JSON(デ)シリアライザーとしてJacksonを使用しています。

4

6 に答える 6

9

詳細情報/スタック トレースを取得するには、log4j.properties で Spring Web のデバッグ ロギングを有効にします。

log4j.logger.org.springframework.web=デバッグ

于 2014-07-21T01:44:24.117 に答える
7

消費するデータが外部 API からのものであり、必要のない不要な要素/プロパティからコントローラーをシールドしたい場合は、POJO クラスで以下の注釈を使用できます。

@JsonIgnoreProperties(ignoreUnknown = true) 

または、グローバルに設定できます

//jackson 2.0
jsonObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
于 2013-02-03T07:20:51.470 に答える
3

古いケース、今では無関係ですが、同様の問題を抱えている他の人のために、このエントリを追加します.

一重引用符ではなく、二重引用符があることを確認してください。また、それらをエスケープしてみてください。

テスト json リクエストにapp curlを使用しました。

私のJSONはこのようなものでした

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

そして、それは私の目に爆発しました。

「クライアントから送信されたリクエストは構文的に正しくありません」は一般的なエラーでした。だから私はそれを一重引用符から二重引用符に変更しました。次に、一重引用符の前にバックスラッシュを付けてみましたが、まだうまくいきません。次に、二重引用符の前のバックスラッシュに変更し、プレスト!

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\"}" 
于 2013-02-20T12:41:49.147 に答える
0

数日以来同じエラーに直面していましたが、@Farm で言及されているように最終的にデバッグ ログを有効にし、この問題の原因を確認することができました。以下に示すように、jsp から spring controller に json で投稿されている Person オブジェクトがありました。

@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);
    }
}); 

送信時のエラーは 400 Bad request で、失敗した理由について他に手がかりはありませんでした。サーバーでデバッグ モードを有効にすると、以下のエラー スタック トレースが表示されました。

**00:53:42,294 DEBUG RequestResponseBodyMethodProcessor:117 - Reading [com.foo.assignment.model.Person] as "application/json" using [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@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: org.apache.catalina.connector.CoyoteInputStream@f264df; 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: org.apache.catalina.connector.CoyoteInputStream@f264df; 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: org.apache.catalina.connector.CoyoteInputStream@f264df; 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**

Address オブジェクトにデフォルトのコンストラクターを追加すると、エラーが解決しました。また、Google アドオンの Postman(プラグインhttps://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en ) を使用すると、変更をすばやくテストできました。

于 2015-08-26T15:04:24.650 に答える
0

問題は POJO にあります。サーバーのログ レベルをデバッグ レベルに保ち、エラーを確認してください。これは主に、フィールドとフィールド タイプの不一致に関連しています。

于 2016-05-28T10:50:45.223 に答える