Ошибка «Не удалось извлечь ответ: не найден подходящий HttpMessageConverter для типа ответа ... и типа содержимого [application / json]» - PullRequest
0 голосов
/ 19 апреля 2019

Я отправляю запрос 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-запроса

1 Ответ

0 голосов
/ 19 апреля 2019

Оба ваших класса нуждаются в конструкторе без аргументов.Вот что говорит вам сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...