在 Java Web 服务中生成的客户端工件

Raj*_*mar 2 java soa soap web-services jax-ws

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

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

kam*_*oor 5

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

\n\n

服务提供商将创建一个 Web 服务并使用 XML 定义 (WSDL) 公开其数据传输契约。现在客户端想要通过创建 XML 输入文件(SOAP 消息)来使用此 Web 服务并与服务器进行通信。

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

例如:使用计算器服务具有加法和减法运算的每个操作都需要特定类型的 SOAP 消息。wsimoport 将生成,

\n\n

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

\n\n
@WebServiceClient(name = "CalculatorService",...)\npublic class CalculatorService\nextends Service\n{\n\n \xe2\x80\xa6.\n @WebEndpoint(name = "ICalculator")\n    public ICalculator getICalculator(WebServiceFeature... features) {\n     .....\n    }\n\xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

用于定义每个操作的 ICalculator 接口,

\n\n
@WebService(name = "ICalculator", targetNamespace = "http://Example.org")\npublic interface ICalculator {\n   \xe2\x80\xa6.\n    @WebMethod(operationName = "Add", action = "http://Example.org/ICalculator/Add")\n    @WebResult(name = "result", targetNamespace = "http://Example.org")\n    @RequestWrapper(localName = "Add", targetNamespace = "http://Example.org", className = "org.example.Add")\n    @ResponseWrapper(localName = "AddResponse", targetNamespace = "http://Example.org", className = "org.example.AddResponse")\n    public Integer add(\n        @WebParam(name = "a", targetNamespace = "http://Example.org")\n        Integer a,\n        @WebParam(name = "b", targetNamespace = "http://Example.org")\n        Integer b);\n\n   \xe2\x80\xa6.\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
@XmlAccessorType(XmlAccessType.FIELD)\n@XmlRootElement(name = "Add")\npublic class Add {\n\n    protected Integer a;\n    protected Integer b;\n    \xe2\x80\xa6. All getter and setter\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

参考文献1 | 参考2

\n\n

JAX-RPC有点旧,你可以从维基百科阅读历史

\n\n

玩得开心

\n