Ссылки HATEOAS неверны при использовании JsonSubTypes - PullRequest
0 голосов
/ 02 октября 2019

Я использую данные по пружине с Mongo, чтобы выставить класс с несколькими подтипами. Когда я делаю это, HATEOAS разделяет результаты на основе фактического экземпляра, а не общего базового типа. Это приводит к тому, что ссылки являются неправильными, и делает пейджинг бесполезным, поскольку это список смешанных типов.

Я попытался явно добавить тег @Relation ко всем задействованным классам, и, похоже, это никак не отразилось навсе. Я получаю одинаковые результаты с этим или без него.

Я использую пружинные зависимости загрузки 2.1.8.RELEASE с spring-boot-starter-data-rest и spring-cloud-зависимость-зависимостями Greenwich.SR1

Базовый класс:

@Relation(collectionRelation = "notifications", value="notifications")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "notificationType")
@JsonSubTypes({
        @JsonSubTypes.Type(value = ModelNotification.class, name = Notification.MODEL_NOTIFICATION),
        @JsonSubTypes.Type(value = BasicNotification.class, name = Notification.BASIC_NOTIFICATION)
})
public class Notification extends UUIDEntity implements Serializable {
    private static final long serialVersionUID = 8199210081144334378L;

    public static final String MODEL_NOTIFICATION = "MODEL_NOTIFICATION";
    public static final String BASIC_NOTIFICATION = "BASIC_NOTIFICATION";

    public enum Severity {
        TRACE,
        DEBUG,
        INFO,
        WARN,
        ERROR,
        FATAL
    }

    public Notification() {
        this.notificationType = BASIC_NOTIFICATION;
    }

    @JsonProperty("notificationType")
    private String notificationType;

    @JsonProperty("createdDate")
    @CreatedDate
    private Instant createdDate;

    @JsonProperty("lastModifiedDate")
    @LastModifiedDate
    private Instant lastModifiedDate;

    @JsonProperty("createdBy")
    @CreatedBy
    private String createdBy;

    @JsonProperty("lastModifiedBy")
    @LastModifiedBy
    private String lastModifiedBy;

    @JsonProperty("severity")
    private Severity severity;

    @JsonProperty("message")
    private String message;

Без дополнительной версии участника:

@Relation(collectionRelation = "notifications", value="notifications")
public class BasicNotification extends Notification implements Serializable {
    private static final long serialVersionUID = 8063077545983014320L;
}

И версия расширения:

@Relation(collectionRelation = "notifications", value="notifications")
public class ModelNotification extends Notification implements Serializable {
    private static final long serialVersionUID = 3700576594274374440L;

    @JsonProperty("storedModel")
    private StoredModel storedModel;

    public ModelNotification() {
        super();
        this.setNotificationType(Notification.MODEL_NOTIFICATION);
    }

Я ожидаю, учитывая добавлениетег @Relation, чтобы все результаты отображались под уведомлениями, что является правильным URL-адресом для конечной точки отдыха данных пружины. Обратите внимание, что все конечные точки работают правильно, но только материал HATEOAS неверен, и связывание создает проблемы. При доступе по адресу: / api / notifications

я получаю обратно:

{
  "_embedded" : {
    "modelNotifications" : [ {
      "notificationType" : "MODEL_NOTIFICATION",
      "createdDate" : "2019-10-02T15:53:42.127Z",
      "lastModifiedDate" : "2019-10-02T15:53:42.127Z",
...
[SNIP FOR BREVITY]
...
        } ]
      },
      "_links" : {
        "self" : {
          "href" : "http://fastscore:8088/api/modelNotification/ef81c342-29d3-48fb-bab3-d416e80bc5f6"
        },
        "modelNotification" : {
          "href" : "http://fastscore:8088/api/modelNotification/ef81c342-29d3-48fb-bab3-d416e80bc5f6"
        }
      }
    } ],
    "notifications" : [ {
      "notificationType" : "BASIC_NOTIFICATION",
      "createdDate" : "2019-10-02T15:52:10.261Z",
      "lastModifiedDate" : "2019-10-02T15:52:10.261Z",
      "createdBy" : "anonymousUser",
      "lastModifiedBy" : "anonymousUser",
      "severity" : "INFO",
      "message" : "Interval Process Completed Successfully",
      "_links" : {
        "self" : {
          "href" : "http://fastscore:8088/api/notifications/93fa5d6b-1457-4fa6-976c-cfdddc422976"
        },
        "notification" : {
          "href" : "http://fastscore:8088/api/notifications/93fa5d6b-1457-4fa6-976c-cfdddc422976"
        }
      }

...
[SNIP]
...
    }, 
  },
  "_links" : {
    "self" : {
      "href" : "http://fastscore:8088/api/notifications{?page,size,sort}",
      "templated" : true
    },
    "profile" : {
      "href" : "http://fastscore:8088/api/profile/notifications"
    },
    "search" : {
      "href" : "http://fastscore:8088/api/notifications/search"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 4,
    "totalPages" : 1,
    "number" : 0
  }
}

Это, очевидно, неверно, так как modelNotifications не является конечной точкой покоя данных пружины. Кроме того, это сделает пейджинг бесполезным, как будто у меня есть тонна уведомлений, пейджинг работает только для них, и я получаю уведомления модели каждый раз, даже если у меня есть только один ... Так что на второй странице я получу вторую страницууведомлений, но на второй странице по-прежнему есть уведомления о модели, даже если у меня была только одна запись.

Этот тип делает поддержку HATEOAS непригодной для использования с пружинными данными.

...