【问题标题】:Client artifacts generated in a java web service在 Java Web 服务中生成的客户端工件
【发布时间】:2014-12-21 16:17:34
【问题描述】:

我参与过很多使用 JAX-WS 实现的 Web 服务项目,例如 Axis。工件是使用 IDE 生成的,并且可以正常工作。但是,我想知道生成的客户端工件以及它们的作用。如果您能提供任何权威的指南或可以提供的资源,那将会很有帮助。

我知道如何生成工件。但找不到任何描述生成的客户端工件及其作用的来源。

【问题讨论】:

  • 请在投票时添加您的评论。我搜索了重复的问题,但找不到任何问题。

标签: java web-services soap jax-ws soa


【解决方案1】:

如您所知,JAX-WS 旨在为 XML Web 服务提供 Java API 规范。作为面向对象的 Java 开发人员,我们不想在代码中处理原始 XML。相反,我们更喜欢 XML 文件的面向对象表示,因此我们只处理类和对象。

服务提供者将创建一个 Web 服务并使用 XML 定义 (WSDL) 公开它的数据传输合同。现在客户端希望通过创建 XML 输入文件(SOAP 消息)并与服务器通信来使用此 Web 服务。

所以您收到了 WSDL 文件,它基本上告诉您如何访问服务(服务端点)、公开的操作是什么、每个服务的输入模式是什么、输出模式是什么、错误模式等等。

与 Web 服务通信的一种方法是手动查看架构并创建 XML (SOAP) 消息并尝试连接到服务。这非常困难,容易出错,不可读和可维护。这就是为什么我们有一个规范来将庞大、复杂的 XML 模式转换为对开发人员更友好、面向对象的类,这些类表示在 WSDL 中定义的完全相同的 XML 元素。它还生成工厂类来创建任何 POJO 类的实例。

获取一个简单的 WSDL 文件并使用 wsimport 生成客户端类。您可以看到,它生成了输入和输出 XML 的面向对象表示、为服务和操作创建的接口、代表整个服务的 Web 服务客户端、帮助您创建任何数据传输类的实例的对象工厂。 JAX-WS 将使用所有这些接口和类来生成最终的 SOAP 消息以调用 Web 服务。

您需要做的就是,创建输入对象并调用 Web 服务操作,JAX-WS 实现将负责将您的对象转换为 SOAP 和进行服务调用的所有繁重工作,然后转换响应SOAP 消息返回到面向对象的表示并返回到您的应用程序。

例如:以具有加减运算的Calculator Service 为例。每个操作都需要特定类型的 SOAP 消息。 wsimoport 将生成,

具有端点定义的高级 WebService 类(ICalculator)

@WebServiceClient(name = "CalculatorService",...)
public class CalculatorService
extends Service
{

 ….
 @WebEndpoint(name = "ICalculator")
    public ICalculator getICalculator(WebServiceFeature... features) {
     .....
    }
…
}

定义每个操作的 ICalculator 接口,

@WebService(name = "ICalculator", targetNamespace = "http://Example.org")
public interface ICalculator {
   ….
    @WebMethod(operationName = "Add", action = "http://Example.org/ICalculator/Add")
    @WebResult(name = "result", targetNamespace = "http://Example.org")
    @RequestWrapper(localName = "Add", targetNamespace = "http://Example.org", className = "org.example.Add")
    @ResponseWrapper(localName = "AddResponse", targetNamespace = "http://Example.org", className = "org.example.AddResponse")
    public Integer add(
        @WebParam(name = "a", targetNamespace = "http://Example.org")
        Integer a,
        @WebParam(name = "b", targetNamespace = "http://Example.org")
        Integer b);

   ….
}

表示所有请求和响应格式的数据传输对象,

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Add")
public class Add {

    protected Integer a;
    protected Integer b;
    …. All getter and setter

}

还有其他一些工厂类。您可以看到所有这些注释都是由 JAX-WS 规范定义的,并被 JAX-WS 实现用来生成 SOAP 消息并促进通信。您不再在应用程序代码中处理 XML。你只做面向对象的编程。

Reference 1 | Reference 2

JAX-RPC 有点老了,你可以从wikipedia读历史

玩得开心

【讨论】:

    【解决方案2】:

    Java JAX-RPC API 通常已被 JAX-WS API 取代 - 请参阅 The Java API for XML-Based Web Services (JAX-WS) 2.0,其中声明 JAX-WS 2.0 (this specification) is a follow-on to JAX-RPC 1.1, ...

    您的 IDE 很可能使用以下工具来生成工件:

      man wsimport
      man wsgen
    

    可以在Java™ API for XML-Based Web Services 2.2 中找到有关 JAX-WS 工作方式及其相关工件的完整说明。

    【讨论】:

    • 感谢您的回复。但是,我正在寻找有关生成的工件及其工作方式的详细信息。因为我已经为 Axis 和 JAX-WS 生成了很多次工件,所以我知道该怎么做。
    猜你喜欢
    • 2015-09-09
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多