java - Spring RestTemplate.getForObject() 的 JSON 转换错误

标签 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 字段之前,但这没有帮助。我已经尝试了字段名称的首字母大写和首字母小写,两者的结果相同。有人能看出我的问题出在哪里吗?

最佳答案

您可能希望将 PropertyNamingStrategy 设置为 PASCAL_CASE_TO_CAMEL_CASE

How to set PropertyNamingStrategy for RestTemplate in SpringBoot?

(您的 clientId getter 和 setter 错误)

希望对你有帮助

关于java - Spring RestTemplate.getForObject() 的 JSON 转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37484626/

相关文章:

javascript - 超链接在新文档窗口中返回 JSON。我希望它返回到像 "response"这样的变量

java - Spring security注销去j_spring_security_logout

spring - 从Spring 3.0.3.RELEASE升级会导致: java. lang.NoSuchFieldError:USER_DECLARED_METHODS

java - n个质数之和java,困惑

java - 以字节形式读取文件,无需换行符或回车符

java - com.google.ads.AdView 实例化失败 - java.lang.ClassNotFoundException : org. json.JSONException

java - 在 Eclipse Luna 中安装新软件总是出现错误 No repository found containing : osgi. bundle,org.eclipse.net4j.jms.api?

java - Activity 到 Activity 回调监听器

java - Java 日历的设置值未给出预期的日期时间

javascript - 使用 jquery 或 javascript 将逗号分隔的键和值字符串转换为对象