Как я могу вернуть в контроллер покоя весной конкретный класс, используя родительский класс? - PullRequest
0 голосов

У меня есть класс A и два предложения B и C, которые являются конкретными классами A

class A {
    private int id;
    //get/set
}

class B extends A { 
    private String attributeB;
    //get/set
}

class C extends A {
    private String attributeC;
    //get/set
}

class AService {
    @Autowired  
    ADao aDao; 
    public List<A> list() {
        return aDao.list();
    }
}
class RestController {
    @Autowired
    AService aService;

    @RequestMapping("api/a")
    public List<A> list() {
        return aService.list(); //Return a List<A> with A, B and C objects
    }
}

Когда я использую api (http-запрос к "/ api / a"), Json выглядит как

[
    { id: 1},
    { id: 2},
    { id: 3},
]

Но второй и третий объекты B и C, ответ должен быть

[
    { id: 1},
    { id: 2, attributeB: "B"},
    { id: 3, attributeC: "C"},
]

Ответы [ 3 ]

0 голосов

Я попробовал пример из https://start.spring.io, как сказал @Hemant, и он работает, к сожалению, в моем проекте я не использую spring-boot, поэтому я решил использовать

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "name")
@JsonSubTypes({ @JsonSubTypes.Type(value = A.class),
    @JsonSubTypes.Type(value = B.class) })
class A {}

class B extends A {}
class C extends A {}

и сейчас работает.

Спасибо всем вам за помощь.

0 голосов
/ 11 мая 2018

Вопрос не совсем понятен, поэтому, я думаю, вы пытаетесь получить тело ответа, которое должно перезапустить список объектов.Т.е.

@RequestMapping(value = "api/getObjectList")
@ResponseBody
public List<ClassA> getObjectList() {
    List<ClassA> testList = new ArrayList<>();
    testList.add(new ClassA());
    testList.add(new ClassB());
    testList.add(new ClassC());
    return testList;
}

Некоторые из этих объектов расширяют базовый класс, classA:

Класс A:

public class ClassA {

    private String propertyA;

    public ClassA() {
        this.propertyA = "A";
    }

    //get/set
}

Класс B: открытый класс ClassB расширяет ClassA {

    private String propertyB;

    public ClassB() {
        this.propertyB = "B";
    }

    //get/set
}

Класс C:

@JsonInclude(Include.NON_NULL)
public class ClassC extends ClassA {

    private String propertyC;

    public ClassC() {
        this.propertyC = "C";
    }

    //get/set
}

Пока все хорошо, этот код ДОЛЖЕН генерировать следующий json, когда вы тестируете его в локальной среде с помощью метода GET:

http://localhost:port/myApp/api/getObjectList

[
  {"propertyA":"A"},
  {"propertyA":"A","propertyB":"B"},
  {"propertyA":"A","propertyC":"C"}
]

Вы сказали, что вы используете парсер Джексона v2.6 + , поэтому если вы используете парсер Джексона, возможно, это тот случай, когдаВы исключили сериализацию свойств NULL.

В приведенном выше примере я инициализировал все свойства в конструкторе по умолчанию!Однако, если вы удалите инициализированные переменные и попытаетесь вернуть нулевое поле, он не будет возвращать значения NULL для свойства объекта ClassC, потому что преобразователь настроен на игнорирование значений NULL.

Однако я бы хотел, чтобы выВы уже заметили это, и более вероятно, что вы или кто-то другой мог установить global ignore для значений NULL в другом месте.

В случае, если вы не используете егои если кто-то еще «немного поиграл» в том же проекте, возможно, вы захотите принять участие в игнорировании пустых полей

0 голосов
/ 11 мая 2018

У меня работает

Контроллер

// mind the annotation here
@RestController
public class Controller {

    @RequestMapping("api/a")
    public List<A> list() {
        List<A> listA = new ArrayList<A>();
        listA.add(new A());
        listA.add(new B());
        listA.add(new C());
        return listA;
    }
}

Вывод:

[
  {
    "id": 0
  },
  {
    "id": 0,
    "attributeB": null
  },
  {
    "id": 0,
    "attributeC": null
  }
]

Библиотека Джексона должна бытьприсутствует в classpath для сериализации / десериализации.
Чтобы избежать проблем с зависимостями, загрузите пример проекта из https://start.spring.io/,, добавьте веб-зависимости и сгенерируйте проект.

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