Crnk отображает разные ресурсы для одного отношения

Вопрос связан с фреймворком Crnk. Например, в JsonApiResource у меня есть поле. И в зависимости от некоторых других значений я хочу, чтобы в этом поле были разные данные. Нравится первый вариант:

"data": {
    "id": "1",
    "attributes": {
        "firstData": //some data 
    }
}

И второй:

"data": {
    "id": "1",
    "attributes": {
        "secondData": //some data 
    }
}

Я попытался добиться этого, создав абстрактный класс, определив такое поле в ресурсе, создав 2 подкласса как JsonApiResources, а в DTOMapper я установил необходимую реализацию.

public abstract class AbstractData {
    abstract List<Integer> getValues();
}

@JsonApiResource(type = "v1/first")
public class FirstTypeData extends AbstractData {
    @JsonApiId
    protected int id;

    @JsonProperty("firstData")
    private List<Integer> values;

    //implemented getter
}

@JsonApiResource(type = "v1/second")
public class SecondTypeData extends AbstractData {
    @JsonApiId
    protected int id;

    @JsonProperty("secondData")
    private List<Integer> values;

    //implemented getter
}

@JsonApiResource(type = "v1/basic")
public class BasicDataDTO {
    @JsonApiId
    protected int id;

    @JsonProperty("data")
    private AbstractData data; //FirstTypeData or SecondTypeData is set here in mapper
}

Это прекрасно работает. Но когда я хочу сделать это отношением (я помещаю JsonApiRelation в поле данных), он разрушается.

Я хочу вызвать в / v1 / basic / {id} / data и получить

{
    "data": {
        "id": "1",
        "type" : "v1/first",
        "attributes": {
            "firstData": //some data 
        }
    }
}

или же

{
    "data": {
        "id": "1",
        "type" : "v1/second",
        "attributes": {
            "secondData": //some data 
        }
    }
}

Возможно ли такое поведение? Или нужно использовать другой подход?

0
0
206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

в настоящее время AbstractData также должен быть ресурсом (и иметь репозиторий ресурсов, поддерживающий его). В противном случае аннотация @JsonApiRelation вызовет ошибку проверки. Но механизм, подобный @MappedSuperclass в JPA, может иметь смысл добавить в crnk.

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