Spring Boot - данные иерархических сущностей не возвращаются из остального API

У меня есть метод API, реализованный в весенней загрузке для курсов. Он получает курс по идентификатору темы. Класс Course реализован как:

@Entity
public class Course {

    @Id
    private String id;
    private String name;
    private String description;
    @ManyToOne
    private Topic topic;
    public Course() {

    }

    public Course(String id, String name, String description, String topicId) {
        super();
        this.id = id;
        this.name = name;
        this.description = description;
        this.topic = new Topic(topicId, "", "");
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    public void setTopic(Topic t) {     
        this.topic = t;     
    }

}

А метод API реализован как:

@RequestMapping(method=RequestMethod.GET, value = "/topics/{topicId}/courses")
    public RestMessage getAllCourses(@PathVariable String topicId) {                
        try {

            List<Course> course = courseService.getAllCourses(topicId);     
            message = new RestMessage(course,StatusCodeEnum.OK);        
            return message;

        } catch (Exception e) {

            message = new RestMessage(e.getMessage(),StatusCodeEnum.INTERNAL_SERVER_ERROR);
            message.setException(e);

            return message;         
        }       
    }

Реализация метода проста, он пытается получить все курсы на основе идентификатора темы и вернуть его как объект RestMessage. Я использую почтальон для тестирования, и в ответ я получаю список Course, но данные объекта Topic отбрасываются.

Ответ API такой:

{
    "data": [
        {
            "id": "java-streams",
            "name": "Java Streams",
            "description": "Java Stream learning"
        }
    ],
    "httpStatus": "OK",
    "statusCode": 200,
    "exception": null
}

А класс RestMessage определяется как:

public class RestMessage {

    private Object data;
    private StatusCodeEnum httpStatus;
    private int statusCode;
    private Exception ex;

    public RestMessage() {

    }

    public RestMessage(Object d, StatusCodeEnum c) {
        data = d;
        httpStatus = c;
        statusCode = c.val();
    }

    public void setData(Object d) {
        data =d;
    }

    public void setHttpStatus(StatusCodeEnum c) {
        httpStatus = c;
    }

    public void setStatusCode(int c) {
        statusCode = c;
    }

    public void setException(Exception e) {
        ex = e;
    }

    public void setStatusCode(StatusCodeEnum c) {
        httpStatus = c;
    }

    public Object getData() {
        return data;
    }

    public StatusCodeEnum getHttpStatus() {
        return httpStatus;
    }

    public Exception getException() {
        return ex;
    }

    public int getStatusCode() {
        return statusCode;
    }

}

Однако я попытался отладить конечную точку API, и перед возвратом объекта RestMessage у меня есть данные в требуемой форме, но после получения ответа json объект Topic усечен для всех курсов.

Образ данных отладки прилагается:

Spring Boot - данные иерархических сущностей не возвращаются из остального API

Интересно, что я делаю не так в этом случае?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
189
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поле topic из Course не имеет геттера, поэтому игнорируется сериализатором JSON.

Ах! действительно, приятный улов :)

Hassaan 08.12.2018 19:11

Вы можете использовать аннотацию Lombok для автоматического создания геттеров и сеттеров.

Просто добавьте определение класса @Dataon, и у вас будут сгенерированные геттеры и сеттеры, конструктор без параметров. У вас будет все, о чем вы можете сказать, это класс POJO.

Проверьте эту ссылку: Проект ломбок

Другие вопросы по теме