Java Spring Rest Вызов для получения подкласса с использованием суперкласса - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь сохранить несколько похожих документов в одном хранилище документов (MongoDB), то есть все классы, расширяющие Foo, хранятся в коллекции Foo.

У меня есть конечная точка отдыха с именем findById, которая возвратила тип Optional, например, / Foo / {ID}.

Когда я отлаживаю это, он возвращает класс Bar (который расширяет Foo

Однако, когда я вызываю это из клиентского приложения java.

Foo Class

    @Data
    @Document(collection = "foo")
    public abstract class Foo {
        @Id
        private int id;

        public Foo(){}
        public Foo(int id){
            this.id = id;
        }

Бар класса

    @Document(collection = "foo")
    @Data
    public class Bar extends Foo{
        private String text;

        @PersistenceConstructor
        public EnterValue(int id, String text){
            super(id);
            this.text = text;
        }

        @Override
        public int getId() {
            return super.getId();
        }

        @Override
        public int setId(UUID id) {
            super.setId(id);
        }

        public String getText(){
            return this.text;
        }

        public void setText(String text) {
            this.text = text;
        }

Код клиента:

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<>(headers);
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<Foo> response = restTemplate.exchange("http://localhost:8080/foo/123",HttpMethod.GET,entity,Foo.class);

Я получаю сообщение об ошибке при извлечении ответа для типа [класс Foo] и типа контента [application / json; charset = UTF-8].

1 Ответ

0 голосов
/ 21 июня 2019
  • тип, который вы помещаете в оператор Diamond в ResponseEntity, не может быть абстрактным;
  • он должен реализовывать Serializable.

public class Bar extends Foo implements Serializable { ... } ... ResponseEntity<Bar> response = restTemplate.exchange("<a href="http://localhost:8080/foo/123" rel="nofollow noreferrer">http://localhost:8080/foo/123</a>", HttpMethod.GET, entity, Bar.class);

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