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

时间:2016-05-27 13:21:45

标签: java json spring web-services rest

我使用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

以下是代码:

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

我还困住了回来的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
       }
   }
}

这里的类似乎与返回的内容相匹配:

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


}

我尝试将@JsonProperty("ClientId")放在clientId字段之前,这对我们没有帮助。我已经为字段名称尝试了第一个字母大写字母和第一个字母小写字母,两者都有相同的结果。有人能看出我的问题在哪里吗?

1 个答案:

答案 0 :(得分:1)

您可能希望将PropertyNamingStrategy设置为PASCAL_CASE_TO_CAMEL_CASE

How to set PropertyNamingStrategy for RestTemplate in SpringBoot?

(您的clientId getter和setter错误)

希望有所帮助