Crnk为一个关系映射不同的资源

时间:2018-04-11 12:01:43

标签: java json-api 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 
        }
    }
}

这种行为是否可以实现?还是应该采用另一种方法?

1 个答案:

答案 0 :(得分:1)

目前AbstractData也必须是一个资源(并有一个资源库支持它)。否则,@ JsonApiRelation注释将导致验证错误。但是类似于JPA的@MappedSuperclass的机制可能值得添加到crnk。

相关问题