【问题标题】:RESTful webservice proxy classRESTful Web 服务代理类
【发布时间】:2012-02-12 19:23:31
【问题描述】:

我编写了一个 Jersey 客户端应用程序,它与两个 Web 服务交互,一个是 REST,另一个是 SOAP。我使用 REST 服务提供的员工数据通过 SOAP 服务创建一个新用户。

REST 服务是一个返回 Employee 实体的 JAX-RS (Jersey) 应用程序:

@Entity
@Table(name = "EMPLOYEE_TABLE")
@XmlRootElement
public class Employee implements Serializable {
  ...
}

我没有为实体类明确创建架构定义。

GET 请求返回 Employee 实体的表示:

GET /employees/100

<Employee id='100' providerId='3345'>
  <Link type="application/xml" href="/employees/100" rel="self"/>
  <Name>Doe, Dr. John</Name>
  <Departments>
    <Department id='10'><Name>Emergency Medicine</Name></Department>
    <Department id='56'><Name>Behavioral Medicine</Name></Department>
  </Departments>
</Employee>

SOAP 服务(BusinessObjects Enterprise Web 服务 SDK)提供 Java 客户端以简化其使用。

虽然我可以解析 Employee 实体的 XML 表示并将其分配给 User 类的适当设置器,但在我的 Jersey 客户端应用程序中创建一个 Employee 代理类(带有适当的注释)可能会更容易。

问题:

  1. JAX-RS(特别是泽西岛,在我的例子中)是否具有公开实体架构定义(XSD 格式)的机制? WADL 文档不包含此类信息。
  2. 虽然我可以手动创建模拟 Employee 资源类的 POJO 类表示,但我可能应该使用“工具”。对此我有什么选择?
  3. 随着时间的推移,我可能需要向 Employee 实体添加其他元素。这是否意味着需要创建新版本的 RESTful 服务?
  4. 假设 Jersey 可以配置为自动生成和公开模式定义,并且对 Employee 的更改会改变模式定义,那么 Employee 实体是否应该实现一个接口来防止未经授权的更改?

【问题讨论】:

  • 关于第 3 点和第 4 点:您必须管理 REST API URL。例如,对于初始版本,您将拥有 /myservice/1.0.0/getlist URL。

标签: jaxb jax-ws jpa-2.0 jersey business-objects-sdk


【解决方案1】:

关于问题 1,如果您的 XSD 部署在您的 web 应用程序中,您可以在浏览器中导航到它。例如,在我的 web 应用程序中,我有一个 /xsd 文件夹,其中包含我的 XSD。当应用程序运行时,我可以将浏览器指向 http://localhost:8080/&lt;app_name&gt;/xsd/&lt;xsd_name&gt;.xsd 并查看 XSD。

【讨论】:

  • 是的。但后来我使用 maven 插件从 XSD 生成 Java 代码。我的理解是你也可以走另一条路。您可以编写您的 Java 代码,然后从中生成您的 XSD。就个人而言,我以前从未这样做过。
  • 我希望实现(在我的例子中是泽西岛)能够动态生成 XSD,并可以选择缓存它以获得更好的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多