Я отправляю запрос GET другому сервису, который возвращает в этом формате:
{
"data": [
{
"email": "eskaferas@gmail.com",
"firstName": "Seras",
"lastName": "Meras"
},
{
"email": "Soras@gmail.com",
"firstName": "Oras",
"lastName": "Moras"
},
{
"email": "bzbzb@gmail.com",
"firstName": "hello",
"lastName": "bye"
},
{
"email": "lrc@gmail.com",
"firstName": "Seras",
"lastName": "Meras"
}
],
"message": "Success"
}
Я использую ResponseEntity следующим образом:
@GetMapping("/todos/{toDoNoteId}/users")
public ResponseEntity getNotesUsersTest(@PathVariable int toDoNoteId) {
ToDoNote note = toDoNoteService.getToDoNoteById(toDoNoteId);
if(note==null) {
throw new ToDoNoteNotFoundException("Note with id "+ toDoNoteId + " not found");
}
RestTemplate restTemplate = new RestTemplate();
final String uri = "http://friend:5000/users";
try {
ResponseEntity<ArrayResponsePojo> result = restTemplate.exchange(uri, HttpMethod.GET,null, new ParameterizedTypeReference<ArrayResponsePojo>() {});
return result;
}
catch (HttpClientErrorException ex) {
return ResponseEntity.status(ex.getRawStatusCode()).headers(ex.getResponseHeaders())
.body(ex.getResponseBodyAsString());
}
}
Однако при отправке запроса GET я получаю такой ответ:
Ошибка определения типа: [простой тип, класс com.tdl.model.ArrayResponsePojo]; вложенное исключение: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
com.tdl.model.ArrayResponsePojo (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (sun.net.www.protocol.http.HttpURLConnection$HttpInputStream); line: 2, column: 5]",
Я не знаю, почему я получаю это исключение, так как у меня есть Contructors. Вот мой класс pojo:
public class ArrayResponsePojo {
private User[] data;
private String message;
public User[] getData() {
return data;
}
public void setData(User[] data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@JsonCreator
public ArrayResponsePojo(User[] data, String message) {
this.data = data;
this.message = message;
}
}
И мой пользовательский класс:
public class User {
private String email;
private String firstName;
private String lastName;
@JsonCreator
public User(String email, String firstName, String lastName) {
super();
this.email = email;
this.firstName = firstName;
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Я пробовал как без, так и с ParameterizedTypeReference.
Может кто-нибудь, пожалуйста, помогите. Я понятия не имею, как это исправить.
EDIT
После добавления конструкторов я получаю это вместо этого.
"Could not extract response: no suitable HttpMessageConverter found for response type [class com.tdl.model.ArrayResponsePojo] and content type [application/json]".
Каждый другой пример этой проблемы имел дело с типом ответа, отличным от application / json.
Я также попытался установить заголовок для application / json.
РЕДАКТИРОВАТЬ 2
Если я установлю тип responseEntity в String, я смогу получить ответ. Тем не менее, мне нужно получить ответы на мой класс POJO
РЕДАКТИРОВАТЬ 3
Я нашел несколько предупреждений с помощью отладчика, что JsonCreators не может быть использован. Затем я добавил JsonProperty в параметры конструктора (или просто пустые конструкторы), и теперь он не возвращает ошибку, а зависает в течение 30 с или около того, и только затем возвращает ожидаемый результат.
Я открыл еще один вопрос для этого здесь, так как это другая проблема: Resttemplate очень медленно для GET-запроса