【问题标题】:Android Spring Rest Client "exchange" creating the class (406 Not Acceptable)Android Spring Rest 客户端“交换”创建类(406 不可接受)
【发布时间】:2017-02-15 15:07:41
【问题描述】:

我已经实现了这个例子Retrieving JSON data via HTTP GET

Json 响应是这样的:

{"employees":[{"personName":"Albert","personSurname":"1stein","personNumber":"1","personMobile":"5555555","personId":"1234567890","personCompanyCode":"CC01"},
{"personName":"Albert","personSurname":"2stein","personNumber":"2","personMobile":"5555556","personId":"1234567891","personCompanyCode":"CC01"},
{"personName":"Albert","personSurname":"2stein","personNumber":"3","personMobile":"5555557","personId":"1234567892","personCompanyCode":"CC01"},
{"personName":"Albert","personSurname":"4stein","personNumber":"4","personMobile":"5555558","personId":"1234567893","personCompanyCode":"CC01"},
{"personName":"Albert","personSurname":"5stein","personNumber":"5","personMobile":"5555559","personId":"1234567894","personCompanyCode":"CC01"}],
"result":true,"message":"OK"}

我不能使用StringHttpMessageConverter,因为我的数据很大(200,000 名员工)它给了我一个 OutOfMemoryError

我想像示例中那样直接从 json 中检索这些数据,但它给了我 406 不可接受的错误

myClass.java:

public class MyClass { private String personName; private String
personSurname; .. ..

(Setters and Getters) .. ..


}

我尝试了以下方法,但没有区别:

restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, myClass.class)

restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, myClass[].class)

从这个 json 中获取 myClass 对象的正确方法是什么?

【问题讨论】:

  • 您的班级名称是 myClass 还是 MyClass ? @serhat
  • 网络服务器响应的Content-Type 是什么?是application/json吗?你为requestEntity 设置了什么标题?是否包含requestHeaders.setAccept(Collections.singletonList(new MediaType("application","json"))); 之类的内容?
  • 您的 JSON 结果不仅仅包含 MyClass 元素的数组。 MyClass 元素的数组只能由 employees 字段访问。因此,您必须创建另一个包含 private MyClass[] employees; 之类的类,并将该类设置为 exchange 方法的第四个参数。
  • @Coder Android Studio 将不允许 myClass.所以错误不可能出现在那个时候。
  • @gus27 我已经为应用程序 json 添加了 setAccept。你的第二个帖子是我认为的原因。我将应用 Coder 的答案并回复该帖子。提前致谢。

标签: android json parsing resttemplate


【解决方案1】:

您正在尝试直接获取子节点,而不是通过父节点。默认情况下,Rest Template 会尝试将响应 JSON 数据转换为指定的类,如果它不适合您的情况,则会抛出错误。

这里是员工类

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"personName",
"personSurname",
"personNumber",
"personMobile",
"personId",
"personCompanyCode"
})
public class Employee {

@JsonProperty("personName")
private String personName;
@JsonProperty("personSurname")
private String personSurname;
@JsonProperty("personNumber")
private String personNumber;
@JsonProperty("personMobile")
private String personMobile;
@JsonProperty("personId")
private String personId;
@JsonProperty("personCompanyCode")
private String personCompanyCode;

@JsonProperty("personName")
public String getPersonName() {
return personName;
}

@JsonProperty("personName")
public void setPersonName(String personName) {
this.personName = personName;
}

@JsonProperty("personSurname")
public String getPersonSurname() {
return personSurname;
}

@JsonProperty("personSurname")
public void setPersonSurname(String personSurname) {
this.personSurname = personSurname;
}

@JsonProperty("personNumber")
public String getPersonNumber() {
return personNumber;
}

@JsonProperty("personNumber")
public void setPersonNumber(String personNumber) {
this.personNumber = personNumber;
}

@JsonProperty("personMobile")
public String getPersonMobile() {
return personMobile;
}

@JsonProperty("personMobile")
public void setPersonMobile(String personMobile) {
this.personMobile = personMobile;
}

@JsonProperty("personId")
public String getPersonId() {
return personId;
}

@JsonProperty("personId")
public void setPersonId(String personId) {
this.personId = personId;
}

@JsonProperty("personCompanyCode")
public String getPersonCompanyCode() {
return personCompanyCode;
}

@JsonProperty("personCompanyCode")
public void setPersonCompanyCode(String personCompanyCode) {
this.personCompanyCode = personCompanyCode;
}

}

这是包含您的 JSON 响应的父类

import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"employees",
"result",
"message"
})
public class EmployeeDataResponse {

@JsonProperty("employees")
private List<Employee> employees = null;
@JsonProperty("result")
private Boolean result;
@JsonProperty("message")
private String message;

@JsonProperty("employees")
public List<Employee> getEmployees() {
return employees;
}

@JsonProperty("employees")
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}

@JsonProperty("result")
public Boolean getResult() {
return result;
}

@JsonProperty("result")
public void setResult(Boolean result) {
this.result = result;
}

@JsonProperty("message")
public String getMessage() {
return message;
}

@JsonProperty("message")
public void setMessage(String message) {
this.message = message;
}

}

在这种情况下,你的休息电话应该如下

EmployeeDataResponse employeeDataResponse = restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, EmployeeDataResponse.class);

如果您需要澄清答案,请告诉我。

【讨论】:

  • 完美运行。对于像我这样的新手来说,这将是一个很好的例子。谢谢。
  • 很高兴能帮上忙!!
猜你喜欢
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2019-03-11
  • 2013-04-26
相关资源
最近更新 更多