简体   繁体   English

Spring restTemplate.getForObject()的JSON转换错误

[英]JSON conversion error from Spring restTemplate.getForObject()

I'm using Spring's RestTemplate to access a web service, and get the following stack trace: 我正在使用Spring的RestTemplate访问Web服务,并获得以下堆栈跟踪:

Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "ClientId" (class com.accesspoint.twctest.MidasCarrierServiceabilityResponse), not marked as ignorable (7 known properties: , "midasCarrierServiceabilityResult", "midasCarrierServiceabilityServiceReturnStatus", "clientId", "midasServiceResponseId", "currentPeriodRequestsUsed", "currentPeriodRequestsAvailable" [truncated]])
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@5e71a70b; line: 1, column: 14] (through reference chain: com.accesspoint.twctest.MidasCarrierServiceabilityResponse["ClientId"]); nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ClientId" (class com.accesspoint.twctest.MidasCarrierServiceabilityResponse), not marked as ignorable (7 known properties: , "midasCarrierServiceabilityResult", "midasCarrierServiceabilityServiceReturnStatus", "clientId", "midasServiceResponseId", "currentPeriodRequestsUsed", "currentPeriodRequestsAvailable" [truncated]])
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@5e71a70b; line: 1, column: 14] (through reference chain: com.accesspoint.twctest.MidasCarrierServiceabilityResponse["ClientId"])
  at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
  at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
  at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
  at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:559)
  at org.springframework.security.oauth2.client.OAuth2RestTemplate.doExecute(OAuth2RestTemplate.java:128)
  at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
  at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:243)
  at com.accesspoint.twctest.TwcTest.go(TwcTest.java:55)
  at com.accesspoint.twctest.TwcTest.main(TwcTest.java:20)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ClientId" (class com.accesspoint.twctest.MidasCarrierServiceabilityResponse), not marked as ignorable (7 known properties: , "midasCarrierServiceabilityResult", "midasCarrierServiceabilityServiceReturnStatus", "clientId", "midasServiceResponseId", "currentPeriodRequestsUsed", "currentPeriodRequestsAvailable" [truncated]])
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@5e71a70b; line: 1, column: 14] (through reference chain: com.accesspoint.twctest.MidasCarrierServiceabilityResponse["ClientId"])
  at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79)
  at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:579)
  at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:672)
  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:906)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:328)
  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
  at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
  at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2002)
  at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
  ... 8 more

And here's the code: 这是代码:

    ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
    String authServerUrl = "https://identserver.com";
    resourceDetails.setAccessTokenUri(authServerUrl);
    resourceDetails.setClientId("myId");
    resourceDetails.setClientSecret("secretsecret");
    resourceDetails.setGrantType("client_credentials");
    resourceDetails.setScope(asList("scopescope"));

    DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext();

    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails, clientContext);
    HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    List<HttpMessageConverter<?>> converters = new ArrayList<>();
    converters.add(converter);
    restTemplate.setMessageConverters(converters);

    String twcApiUrl = "https://contentserver.com"
            + "?trackingId=test"
            + "&clientId=myId"
            + "&address=605 W MAIN ST"
            + "&city=NEW LEBANON"
            + "&state=OH"
            + "&zip=45345";

    final MidasCarrierServiceabilityResponse midasCarrierServiceabilityResultAddress 
            = restTemplate.getForObject(twcApiUrl, MidasCarrierServiceabilityResponse.class);
    String s = midasCarrierServiceabilityResultAddress.toString();
    System.out.println(s);

I've also trapped the JSON that comes back: 我还捕获了返回的JSON:

{"ClientId":"myId",
 "ClientTrackingId":"test",
 "MidasServiceResponseId":"7b2f4123-8b65-4021-ac92-6756ce750ccd",
 "CurrentPeriodRequestsUsed":5,
 "CurrentPeriodRequestsAvailable":995,
 "MidasCarrierServiceabilityServiceReturnStatus":
   {"ServiceResponseCode":200,
    "ServiceResponseMessage":"OK"
   },
 "MidasCarrierServiceabilityResult":
   {"ResultItemCount":1,
    "MidasGeocoderServiceReturnStatus":
      {"GeocodeServiceReturnStatus":200,
       "GeocodeServiceReturnStatusMessage":"OK"
      },"MidasCarrierServiceabilityGeocodeAddressResultItems":
      [{"ResultAddress":
         {"Address1":"605 W MAIN ST",
          "Address2":"",
          "City":"NEW LEBANON",
          "State":"OH",
          "ZipCode":"45345",
          "GeocodeResults":null
         },
        "FiberResult":
           {"BuildingKey":159088,
            "Lata":"328",
            "ClliCode":"NWLBOH04",
            "CoaxStatus":"Serviceable On-Net",
            "FiberStatus":"Construction Required (contact your sales rep.)",
            "ServiceInstallInterval":"Unknown"
           }
       }
      ],
    "InternalAddressKey":"8cfa2b89-63ab-4dc2-a188-74fb7eab2d31",
    "CustomerAddressKey":"NAK",
    "RequestAddressItem":
       {"IsInvalid":false,
        "InternalAddressKey":"8cfa2b89-63ab-4dc2-a188-74fb7eab2d31",
        "CustomerAddressKey":"NAK",
        "MidasGeocodeRequestAddress":
           {"Address":"605 W MAIN ST",
            "City":"NEW LEBANON",
            "State":"OH",
            "Zipcode":"45345"
           },
        "MidasGeocoderAddressValidationStatus":null
       }
   }
}

And here's the class that appears to match what is returned: 这是看起来与返回的内容匹配的类:

package com.accesspoint.twctest;

import org.codehaus.jackson.annotate.JsonProperty;

public class MidasCarrierServiceabilityResponse {
    private String clientId;
    private String clientTrackingId;
    private String midasServiceResponseId;
    private int currentPeriodRequestsUsed;
    private int currentPeriodRequestsAvailable;
    private MidasCarrierServiceabilityServiceReturnStatus midasCarrierServiceabilityServiceReturnStatus;
    private MidasCarrierServiceabilityResult midasCarrierServiceabilityResult;

    public String getClientId() {
        return ClientId;
    }

    public void setClientId(String ClientId) {
        this.ClientId = ClientId;
    }

    public String getClientTrackingId() {
        return clientTrackingId;
    }

    public void setClientTrackingId(String ClientTrackingId) {
        this.clientTrackingId = ClientTrackingId;
    }

    public String getMidasServiceResponseId() {
        return midasServiceResponseId;
    }

    public void setMidasServiceResponseId(String MidasServiceResponseId) {
        this.midasServiceResponseId = MidasServiceResponseId;
    }

    public int getCurrentPeriodRequestsUsed() {
        return currentPeriodRequestsUsed;
    }

    public void setCurrentPeriodRequestsUsed(int CurrentPeriodRequestsUsed) {
        this.currentPeriodRequestsUsed = CurrentPeriodRequestsUsed;
    }

    public int getCurrentPeriodRequestsAvailable() {
        return currentPeriodRequestsAvailable;
    }

    public void setCurrentPeriodRequestsAvailable(int CurrentPeriodRequestsAvailable) {
        this.currentPeriodRequestsAvailable = CurrentPeriodRequestsAvailable;
    }

    public MidasCarrierServiceabilityServiceReturnStatus getMidasCarrierServiceabilityServiceReturnStatus() {
        return midasCarrierServiceabilityServiceReturnStatus;
    }

    public void setMidasCarrierServiceabilityServiceReturnStatus(MidasCarrierServiceabilityServiceReturnStatus midasCarrierServiceabilityServiceReturnStatus) {
        this.midasCarrierServiceabilityServiceReturnStatus = midasCarrierServiceabilityServiceReturnStatus;
    }

    public MidasCarrierServiceabilityResult getMidasCarrierServiceabilityResult() {
        return midasCarrierServiceabilityResult;
    }

    public void setMidasCarrierServiceabilityResult(MidasCarrierServiceabilityResult midasCarrierServiceabilityResult) {
        this.midasCarrierServiceabilityResult = midasCarrierServiceabilityResult;
    }


}

I tried putting @JsonProperty("ClientId") before the clientId field, that didn't help. 我尝试将@JsonProperty("ClientId")放在clientId字段之前,这没有帮助。 I've tried both first-letter-capitals and first-letter-lowercase for the field names, same result in both. 我已经尝试过使用首字母大写和首字母小写的字段名称,两者的结果相同。 Can someone see where my problem is? 有人可以看到我的问题在哪里吗?

Probably you want to set the PropertyNamingStrategy to PASCAL_CASE_TO_CAMEL_CASE 可能您想将PropertyNamingStrategy设置为PASCAL_CASE_TO_CAMEL_CASE

How to set PropertyNamingStrategy for RestTemplate in SpringBoot? 如何在SpringBoot中为RestTemplate设置PropertyNamingStrategy?

(Your clientId getter and setter are wrong) (您的clientId getter和setter错误)

Hope it helps 希望能帮助到你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 restTemplate.getForObject上的HttpClientErrorException - HttpClientErrorException on restTemplate.getForObject Spring Boot 微服务 - 将授权标头添加到 restTemplate.getForObject - Spring Boot Microservices - Add authorization header to restTemplate.getForObject 在 Android 中使用 restTemplate.getForObject 反序列化 JSON object 的正确方法 - Proper way to use restTemplate.getForObject to deserialize JSON object in Android 没有获得通过RestTemplate.getForObject传递的标头 - not getting headers passed with RestTemplate.getForObject restTemplate.getForObject(“URL”,Object [] .class)可以返回NULL吗? - Can restTemplate.getForObject(“URL”, Object[].class) return NULL? 如何对 Mediatypes Rest 端点进行 restTemplate.getForObject 调用 - How to make restTemplate.getForObject call for Mediatypes Rest endpoint 调用restTemplate.getForObject时如何处理未找到数据 - How to handle no data found when calling restTemplate.getForObject Spring RestTemplate GetForObject为JSON响应提供XML特定的异常 - Spring RestTemplate GetForObject giving an XML specific exception for a JSON response Spring RestTemplate getForObject 得到 404 - Spring RestTemplate getForObject getting 404 Spring RestTemplate getForObject() 给出 401 未经授权的异常 - Spring RestTemplate getForObject() giving 401 unauthorized exception
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM