我曾在一些使用JAX-WS实现(如Axis)的Web服务项目中工作过。通过使用IDE生成工件,它可以工作。但是,我想知道生成的客户端工件及其功能。如果您能提供任何明确的指南或来源,将会很有帮助。
我知道如何生成工件。但找不到任何描述生成的客户端工件及其作用的源。
答案 0 :(得分:4)
如您所知,JAX-WS旨在为XML Web Services提供Java API规范。作为面向对象的Java开发人员,我们不想在代码中处理原始XML。我们喜欢XML文件的面向对象表示,因此我们只处理类和对象。
服务提供商将使用XML定义(WSDL)创建Web服务并公开其数据传输合同。现在,客户端希望通过创建XML输入文件(SOAP消息)并与服务器通信来使用此Web服务。
所以你收到的WSDL文件基本上告诉你如何访问服务(服务端点),暴露的操作是什么,每个服务的输入模式是什么,输出模式是什么,错误模式等等。
与Web服务通信的一种方法是手动查看架构并创建XML(SOAP)消息并尝试连接到该服务。这非常困难,容易出错,无法读取和维护。这就是为什么我们有一个规范,将庞大,复杂的XML模式转换为更加开发人员友好的面向对象的类,它们代表了与WSDL中定义的完全相同的XML元素。它还生成工厂类以创建任何POJO类的实例。
获取一个简单的WSDL文件并使用wsimport生成客户端类。您可以看到,它生成了输入和输出XML的面向对象表示,为服务和操作创建的接口,表示整个服务的Web服务客户端,Object Factory,它可以帮助您创建任何数据传输类的实例。 JAX-WS将使用所有这些接口和类来生成最终的SOAP消息以调用Web服务。
您需要做的就是创建输入对象并调用Web服务操作,JAX-WS实现将负责将您的对象转换为SOAP并进行服务调用,然后转换响应SOAP消息返回面向对象的表示并返回到您的应用程序。
例如:选择具有Add和Substract操作的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。你只需要进行面向对象的编程。
JAX-RPC比较旧,您可以从wikipedia
读取历史记录玩得开心
答案 1 :(得分:0)
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工作方式及其相关工件的完整说明。