java - 如何最好地在 XML 中实现 HATEOAS 的链接关系?

标签 java web-services rest jaxb domain-driven-design

我们有一个 Java 服务器 Web 应用程序,其中系统的核心包含一个非常复杂的域模型,该模型是根据域驱动设计的原则设计的。在大多数情况下,这些域对象很少受到应用程序其他关注点的影响。

我们现在正在寻求在系统前面放置一个 REST 网络服务 API,我正在努力解决如何最好地实现我们自己的新媒体类型中的 HATEOAS 链接。例如,假设我们有域类 foo,它有一个带有 JAX-B 注释的 id 和 name 属性:

@XmlType(name = "foo")
public class FooImpl implements Foo {

    private String name;
    private String id;

    ...snip....

@XmlID
@XmlAttribute
@Override
public String getId() {
    return id;
}

    @XmlElement
    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(final String name) {
        this.name = name;
    }
}

但是我想要返回的 XML 看起来像这样:

<foo id="123" href="http://myserver.com/foos/123">
   <name>myFoo</name>
   <links>
          <link rel="previous" href="http://myserver.com/foos/122" type="application/mything+xml" />
          <link rel="next" href="http://myserver.com/foos/124" type="application/mything+xml" />
          <link rel="edit" href="http://myserver.com/foos/123" type="application/mything+xml" />
          <link rel="revise" href="http://myserver.com/foos/123" method="put" type="application/mything+xml" />
          <link rel="cancel" href="http://myserver.com/foos/123?op="cancel"" method="post" type="application/mything+xml" />
   </links>
</foo>

这样做的最佳方法是什么,这样我就不会用这些媒体类型链接污染我的域设计,但仍然可以使用 JAX-B 的强大功能进行 XML 编码?以下是一些想法:

1) JAX-B 适配器 - 我可以使用它们来修改实体的 XML 并插入链接..这可能吗?合理吗?有例子吗?

2) DTO 层 - 创建一个新的 REST 服务层,将我的域对象转换为 DTO。到目前为止,我们已经能够避免 DTO 的麻烦。虽然这将为我们返回给客户的内容提供完全的灵 active ,但我也不打算在这里创建与域无关的客户。

3) Link Headers - 我真的很喜欢这个想法,但我认为它(单独)行不通,因为有时我们的资源包含子资源的集合。在这种情况下,子资源仍然必须编码到包含链接/href 等的 XML 中。因此,虽然链接 header 解决了顶级类型的问题,但它并没有解决整个问题。否则请随意说!

是否有另一种方法可以帮助我避免 DTO,同时对域模型保持透明?

最佳答案

问题是正确生成链接需要知道生成它们的上下文,这反过来意味着简单的 JAXB 拦截器无法完成这项工作:它们根本不知道要插入什么 URL。更重要的是,生成下一个和上一个链接需要知道这些值是什么;说它们是连续的可能并不安全,因为这意味着当其他资源被删除时资源会更改其 URL,这太疯狂了。

最安全、最简单的方法是使用包装类(上面带有 JAXB 序列化注释),它委托(delegate)给 DAO 层以获取所需的信息。虽然这可能需要编写大量代码,但至少很容易正确编写此类代码。花哨的自动化装饰会更难。

关于java - 如何最好地在 XML 中实现 HATEOAS 的链接关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884461/

相关文章:

java - Codename 通过 Linkedin 进行一次登录

java - 无法在 WildFly 10 中上传超过 1MB 的文件?

java - Eclipse - 尝试基于 WSDL 文件创建 Web 服务时出现意外异常

.net - 如何检查 Web 服务请求期间发送的 xml?

forms - 带有页面流的 Yesod 表单

javascript - Nodejs + mongodb 中 REST API 的自定义 URL

rest - 如何在 REST 中支持部分更新 (PATCH)

java - 通过使用 Lambda 函数匹配 map 列表和对象列表之间的字段来创建列表组合?

java - Apache 化学-Java : Random "Unauthorized" exception when uploading documents to SharePoint 2010

java.lang.IllegalArgumentException Webservice 不是接口(interface)