尽管链接在资源中,但泽西2 getLinks()返回空集

时间:2013-12-11 13:15:01

标签: java rest rest-client jersey-2.0

编辑较短版本

好的,看看我自己的帖子,我发现这可能不是最简短的阅读内容,所以我想我会写一个更简洁的版本,附上一些更实际的细节。

我正在使用Jersey 2客户端框架对Documentum REST API进行编码,该API暂时托管在我的本地计算机上。如果我执行以下代码:

WebTarget target = client.target("http://localhost:8080/dctm-rest/repositories/repo");
Response response = t.request().get();

并且返回的XML看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<repository xmlns="http://identifiers.emc.com/vocab/documentum" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <... metadata entries></>
    <links>
        <link rel="self" href="http://localhost:8080/dctm-rest/repositories/repo"/>
        <link rel="http://identifiers.emc.com/linkrel/users" href="http://localhost:8080/dctm-rest/repositories/darwin_test/users"/>
        <... more links />
    </links>
</repository>

...那么我需要做什么才能以下列方式获取响应中的链接:

Link self = response.getLink("self");

以上命令最终只有selfnull

结束编辑

我已经尽力找到解决方案但到目前为止没有运气。

基本上我正在使用一个REST Web服务,它默认返回JSON格式的资源,这非常好(不过很多比xml好)。我使用Jersey 2.4.1来使用服务,虽然我对REST服务进行编码很新,但除了这个之外我还没有任何实际问题(就我而言,这真的比REST更多与Jersey相关可以告诉)。

基本上,我没有运气使用Jersey 2 API来检索和遍历服务返回的链接。 Jersey 2在其文档中有以下(简短)示例:

// server side - adding links to a response:
Response r = Response.ok().
    link("http://oracle.com", "parent").
    link(new URI("http://jersey.java.net"), "framework").
    build();

哪个imho是以下返回数据的等价物:

<link rel="parent" href="http://oracle.com"/>
<link rel="framework" href="http://jersey.java.net"/>

现在要获取这些关系的链接,文档中的客户端代码如下所示:

// client-side processing:
final Response response = target.request().get();
URI u = response.getLink("parent").getUri();
URI u = response.getLink("framework").getUri();

我认为这非常简单。现在我的服务,在我的WebTarget对象指向的URL中,有大约10个以下JSON格式的链接:

{ 
    ... <metadata before the links> ...

    "links" : 
    [
        {
            "rel"  : "some relation",
            "href" : "some http url"
        } 
        ... about 10 more entries like this
    ]
}

问题在于,如果我对文档中的内容进行客户端等效:

WebTarget t = client.target("url");
t.request().get().getLinks();

..然后我回来了,只有空Set<Link>

怀疑它可能与Client以某种方式启用JSON绑定有关,但我尝试添加MOXy的依赖项,如果是的话,显然应该是自启用的在类路径中,这没有帮助。

我确信我错过了一些非常基本的东西,但我一整天都在搜索,测试不同媒体类型的请求和我能想到的任何东西,但没有运气。虽然我的应用程序在没有这种链接处理的情况下工作正常,但我仍然希望能够正常工作。

感谢您提供任何帮助。

// Andreas

编辑对用户1888440的回复

我同意,链接确实在查询资源时返回的实体中。这也符合我处理资源的方式,我在哪里使用:

JsonObject o = Json.createReader(target.request().get().readEntity(InputStream.class)).readObject();

..然后以下列方式查询对象的链接:我需要首先从JsonObject o获取“links”-JsonArray,然后遍历找到的所有链接,比较“rel”-description与我的内容然后返回正确的“href”值。

但是我认为应该有一种更平滑的方式来获取实体中的链接,特别是如果我们将此过程与以下内容进行比较:

response = target.request().get();
URI u = response.getLink("parent").getUri();
URI u = response.getLink("framework").getUri();

我得到你所说的,上面的getLink(“rel”)/ getLinks()方法仅适用于响应标题中的链接。但是肯定在实体内部必须有一些等效的处理链接的方法,这不像我上面描述的那样冗长吗?

PS:您建议的示例,将资源实体读入Map

Map entity = t.get( Map.class );

..不起作用,导致null的{​​{1}}值。

1 个答案:

答案 0 :(得分:0)

供应商向您发送嵌入在响应中的实体中的链接,而不是响应本身中的链接。试试这个:

Map entity = t.get( Map.class );
Map<String,String> links = (Map<String,String>)entity.get( "links );
URI uriSelf = URI.create( links.get( "self" ) );

您会看到实体中的链接不在请求的标头中。响应链接用于标题链接。您还可以创建一个更具体的对象,这只是使用map来获取属性数据。