使用spring-hateoas反序列化JSON(链接+嵌入式容器)的便捷方法是什么?

时间:2015-12-14 10:29:39

标签: json jackson json-deserialization hateoas spring-hateoas

同事!

我们希望将Rest Client写入遵循HATEOAS原则的服务。所以我们有以下HAL + JSON表示,我们想用spring-hateoas反序列化它:

{
    "id": "1",
    "title": "album title",
    "artistId": "1",
    "stockLevel": 2,
    "_links": {
        "self": {"href": "http://localhost:8080/rest/albums/1"},
        "artist": {"href": "http://localhost:8080/rest/artist/1"}
    },
    "_embedded": {
        "albums": [{ //can be array or object
            "id": "1",
            "title": "album title",
            "artistId": "1",
            "stockLevel": 2,
            "_links": {
                "self": {"href": "http://localhost:8080/rest/albums/1"}
            }
        }],
        "artist": { //can be array or object
            "id": "1",
            "name": "artist name",
            "_links": {
                "self": {"href": "http://localhost:8080/rest/artist/1"}
            }
        } //.... 
    }
}

我们期望像这样的java对象:

HalResource {
    Resource<Album> //entity 
    List<Link> // _links
    List<Resource<BaseEntity>>{ //_embedded
        Resource<Album>
        Resource<Artist>
         ....
    } 
}

因此我们拥有嵌入式(资源列表)和实体(单一资源)的自定义资源表示:

@XmlRootElement(name = "resource")
public class HalResource<EntityType, EmbeddedType> extends Resources<EmbeddedType> {

    @JsonUnwrapped
    private EntityType entity;

    public HalResource() {
    }

    public HalResource(Iterable<EmbeddedType> content, Link... links) {
        super(content, links);
    }

    public EntityType getEntity() {
        return entity;
    }

    public void setEntity(EntityType entity) {
        this.entity = entity;
    }
}

DTO课程:

public abstract class BaseEntity{}

@XmlRootElement(name = "album")
public class Album extends BaseEntity {  
    private String id;
    private String title;
    private String artistId;
    private int stockLevel;

    // getters and setters...
}

@XmlRootElement(name = "artist")
public class Artist extends BaseEntity {
    private String id;
    private String name;

    // getters and setters...
}

我们希望得到类似这样的内容,其中Entity将是Artist或Album,但HalResourcesDeserializer返回Resource.class并带有null内容。

    HalResource<Album, Resource<Entity>> resources = 
    restClient.getRootTarget().path("albums/1").queryParam("embedded", true).request().accept("application/hal+json")
    .get(new GenericType<HalResource<Album, Resource<Entity>>>() {});

通过使用 @JsonTypeInfo @JsonSubTypes anotations,我们成功地反序列化了我们的JSON(您可以see the example on the github),但我们不希望有一些额外的以DTO和JSON格式输入filds和anotattions。

我们看到一个解决方案是创建一个可以处理它的自定义反序列化器。

所以问题是:使用spring-hateoas反序列化JSON(链接+嵌入式容器)的便捷方法是什么?

我们使用spring-hateoas 0.16v(但我们尝试了0.19v)和glassfish jersey 2.22.1

谢谢!

0 个答案:

没有答案