【问题标题】:Getting HTTP response as a java object将 HTTP 响应作为 java 对象获取
【发布时间】:2017-12-19 10:52:40
【问题描述】:

我正在使用 Spring Web 创建一个休息资源。我在 Java 中创建了类似于 Json 响应的 Document 对象。当我使用 String.class 作为响应类型时,我从请求中得到响应。当我更改对我创建的类的响应时,男孩为空。

这是我的 HttpGettter

   private <T> T perform(String token, String resourcePath, Class<T> responseType, HttpMethod method, MultiValueMap<String, String> queryParams) {
     UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.newInstance()
          .scheme(protocol)
          .host(host);

    UriComponents uriComponents = uriComponentsBuilder.build();
    String url = uriComponents.toString();

    HttpHeaders headers = new HttpHeaders();
    headers.add("contentType","application/json");

    HttpEntity<String> requestEntity = new HttpEntity<>(headers);
    ResponseEntity<T> responseEntity = restTemplate.exchange(url, method, requestEntity, responseType);
    return responseEntity.getBody();
   }
     return null;
 }

Json 文档

@JsonIgnoreProperties(ignoreUnknown = false)
public class SiteDocument {

  @JsonProperty("id")
  private int siteID;
  @JsonProperty("site_name")
  private String siteName;
  @JsonProperty("url")
  private String url;
}

函数调用

 perform(null, "/sites", SiteDocument[].class, HTTP.get,null)

JSON 响应

{  
 "items":[  
  {  
     "id":5841970702,
     "site_name":"test",
     "url":"http://sample/again/",
     "pages":2,
     "policies":0,
     "product":[  
        "quality_assurance",
        "accessibility",
        "seo",
        "policy"
     ],
     "_links":{  
        "site":{  
           "href":"https://api.siteimprove.com/v2/sites/5841970702"
        }
     }
  },

  {  
     "id":5881398958,
     "site_name":"preview.site",
     "url":"http://sample.site",
     "pages":0,
     "policies":0,
     "product":[  
        "quality_assurance",
        "policy"
     ],
     "_links":{  
        "site":{  
           "href":"https://api.siteimprove.com/v2/sites/5881398958"
        }
     }
  }
 ],
 "total_items":5,
 "total_pages":1,
  "links":{  
  "self":{  
     "href":"https://api.siteimprove.com/v2/sites"
  }
  }
  }

忽略 JSON 响应的不正确格式。编辑使其简短。

例外

线程“main”中的异常 org.springframework.web.client.RestClientException:无法提取 响应:没有找到适合响应类型的 HttpMessageConverter [班级 [Lcom.blueprint.siteimprove.webresources.documents.SiteDocument;] 和内容类型 [text/html]

更新异常

无法提取响应:找不到合适的 HttpMessageConverter 响应类型 [类 [Lcom.coremedia.blueprint.siteimprove.webresources.documents.SiteDocument;] 和内容类型 [application/json;charset=utf-8]

在标题上添加了愚蠢的

  headers.add("Accept","application/json");
  headers.add("Content-Type","application/json");

【问题讨论】:

  • 从异常看来,响应格式是 text/html 并且 spring 找不到合适的转换器。尝试在您的请求中将接受标头设置为“application/json”
  • 乍一看是 headers.add("contentType", "...") 改成 headers.add("Content-Type", "...")跨度>
  • @uday:我已经试过了。我也得到了同样的错误。
  • 你能发布控制器代码吗?它应该使用 @RestController 或任何其他 WS 进行注释,并且应该配置为生成 JSON。
  • @pvpkiran:现在在标题中添加了内容类型,内容类型更改为 application/json

标签: java json spring http


【解决方案1】:

问题出在 POM 文件中。 POM 文件中未添加运行时依赖项。 POM文件中需要添加以下依赖。

  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
  </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <scope>runtime</scope>
    </dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多