使用Atom的Jersey超媒体技术

3
每本关于REST的书都使用<atom:link href="..." rel="...">来定义RESTful应用程序中的超媒体,但是Jersey(使用JAXB)似乎没有此支持。
我尝试了在package-info.java中使用@XmlSchema,如这里所解释的;我还尝试扩展NamespacePrefixMapper,如这里所解释的。但是两者都不起作用,最多只能输出以下内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer xmlns:ns2="http://www.w3.org/2005/Atom">
    <first-name>Roland</first-name>
    <ns2:link href="/customer/1" rel="self" />
</customer>

在Jersey中使用命名空间和Atom似乎是不可能的。我错过了什么吗?

ps. 我正在使用XSD生成@XmlElement类,目前我创建自己的Link类。是否有一个模式或JAR可以做到这一点(jersey-atom maven依赖项使用rome但没有任何帮助)


你的问题是完全获取不到链接,还是想让链接具有“atom”命名空间前缀? - jayraynet
我想要命名空间前缀。我还想知道是否需要自己创建AtomLink类。谢谢。 - yves amsellem
2
RESTEasy有自己的解决方案:http://docs.jboss.org/resteasy/2.0.0.GA/userguide/html_single/#LinkHeader(类似于jayraynet的想法,但使用注释使其更容易)。我认为我在某个地方读到过它很可能是JAX-RS 2.0规范的一部分(这意味着它很可能也是Jersey的一部分)。 - Tyler
2个回答

3
假设您不关心命名空间前缀,只想创建链接,以下是我的方法。在我的资源类(Jersey REST服务)中,我返回一个Java对象(下面是“Person”),其类装饰有JAXB注释。其中一个属性返回Atom链接对象。
@XmlRootElement(namespace = Namespace.MyNamespace)
public class Person implements Serializable {
    private AtomLinks links = null;

    @XmlElement(name = "link", namespace = Namespace.Atom)
    public AtomLinks getLink() {
        if (this.links == null) {
            this.links = new AtomLinks();
        }

        return this.links;
    }
..
}

@XmlAccessorType(value = XmlAccessType.NONE)
public class AtomLinks extends ArrayList<AtomLink> {
..
}

@XmlAccessorType(value = XmlAccessType.NONE)
public class AtomLink implements Serializable {
    @XmlAttribute(name = "href")
    public URI getHref() {
        return href;
    }
    @XmlAttribute(name = "rel")
    public String getRel() {
        return rel;
    }
    @XmlAttribute(name = "type")
    public String getType() {
        return type;
    }
    @XmlAttribute(name = "hreflang")
    public String getHreflang() {
        return hreflang;
    }
    @XmlAttribute(name = "title")
    public String getTitle() {
        return title;
    }
..
}

public class Namespace {
    public final static String Atom = "http://www.w3.org/2005/Atom";
..
}

在返回我的对象("Person")之前,我填写链接,创建自链接和其他相关链接。我利用Jersey注入的uriInfo对象来获取基础URL。如果这有帮助但您需要更多示例,请告诉我,我会填补空白。


1

如果我没记错的话,Jersey 中有一种方法可以将链接注入到对象中。

请参见:Jersey 2.9 用户指南 第6章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接