`
Aga
  • 浏览: 217744 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Axis2 XMLBean数据绑定

阅读更多
转自:http://jy158757.iteye.com/blog/115370
XMLBeans

XMLBeans 是包含数据绑定层的通用 XML 处理框架。其源自一个 BEA Systems 项目,后来提交给了 Apache Foundation。XMLBeans 是 Axis2 支持的第一种数据绑定形式,并将继续作为与 Axis2 一起使用的热门选项(特别是使用复杂模式定义时)。

清单 7 显示了示例应用程序的 XMLBeans 客户机代码中最有意义的部分。对于基本(非取消包装)ADB 代码,每个操作的输入和输出都有一个对应的独立类。但 XMLBeans 与 ADB 并不相同,其中具有针对包含输入或输出类的文档添加的类(例如,除了 GetBook 类外,还有 GetBookDocument)。其直接效果就是在使用 XMLBeans 代替 ADB 时会添加一个对象创建层。Axis2 中没有为 XMLBeans 提供取消包装支持,因此没有办法避免这个添加的对象层。所得到的结果是 XMLBeans 生成的类比其他数据绑定框架的对等项使用更为复杂。


清单 7. XMLBeans 客户机代码
               
// create the client stub
XmlbeansLibraryStub stub = new XmlbeansLibraryStub(target);
       
// retrieve a book directly
String isbn = "0061020052";
GetBookDocument gbd = GetBookDocument.Factory.newInstance();
GetBookDocument.GetBook gb = gbd.addNewGetBook();
gb.setIsbn(isbn);
gbd.setGetBook(gb);
GetBookResponseDocument gbrd = stub.getBook(gbd);
BookInformation book = gbrd.getGetBookResponse().getGetBookReturn();
if (book == null) {
  System.out.println("No book found with ISBN '" + isbn + '\'');
} else {
  System.out.println("Retrieved '" + book.getTitle() + '\'');
}
       
// retrieve the list of types defined
GetTypesDocument gtd = GetTypesDocument.Factory.newInstance();
gtd.addNewGetTypes();
GetTypesResponseDocument gtrd = stub.getTypes(gtd);
TypeInformation[] types =
  gtrd.getGetTypesResponse().getGetTypesReturnArray();
System.out.println("Retrieved " + types.length + " types:");
for (int i = 0; i < types.length; i++) {
  System.out.println(" '" + types[i].getName() + "' with " +
    types[i].getCount() + " books");
}
       
// add a new book
String title = "The Dragon Never Sleeps";
isbn = "0445203498";
try {
  AddBookDocument abd = AddBookDocument.Factory.newInstance();
  AddBookDocument.AddBook ab = abd.addNewAddBook();
  ab.setAuthorArray(new String[] { "Cook, Glen" });
  ab.setIsbn(isbn);
  ab.setTitle(title);
  ab.setType("scifi");
  stub.addBook(abd);
  System.out.println("Added '" + title + '\'');
  title = "This Should Not Work";
  ab.setTitle(title);
  stub.addBook(abd);
  System.out.println("Added duplicate book - should not happen!");
} catch (AddDuplicateFaultException e) {
  System.out.println("Failed adding '" + title +
    "' with ISBN '" + isbn + "' - matches existing title '" +
    e.getFaultMessage().getAddDuplicate().getBook().getTitle() +
    '\'');
}
       
// create a callback instance
BooksByTypeCallback cb = new BooksByTypeCallback();
       
// retrieve all books of a type asynchronously
GetBooksByTypeDocument gbtd =
  GetBooksByTypeDocument.Factory.newInstance();
gbtd.addNewGetBooksByType().setType("scifi");
stub.startgetBooksByType(gbtd, cb);
long start = System.currentTimeMillis();
synchronized (cb) {
  while (!cb.m_done) {
    try {
      cb.wait(100L);
    } catch (Exception e) {}
  }
}
System.out.println("Asynchronous operation took " +
  (System.currentTimeMillis()-start) + " millis");
if (cb.m_response != null) {
  BookInformation[] books =
    cb.m_response.getGetBooksByTypeResponse().getGetBooksByTypeReturnArray();
  ...



清单 7 中的客户和对应的服务器代码可在 Axis2 1.1.1 下正常执行,但由于1.2 版中针对 XMLBeans 的错误处理代码生成存在问题,会在添加重复书籍 ID 时遇到意外异常,从而失败。这个问题应该已经在下一个 Axis2 版本中得到解决。

尽管 XMLBeans 声称 100% 支持 XML 模式,但这个说法的准确性有待商榷。对于几乎任何模式构造,XMLBeans 都生成了一组能用于读写匹配此模式的文档。但与本文讨论的其他数据绑定框架不同的是,XMLBeans 缺省情况下并不进行任何工作来执行模式。例如,如果将清单 7 代码中添加的设置书籍标题的代码行注释掉,XMLBeans 仍然能正常读写缺少所需的

清单 8. XMLBeans 客户机和无效文档
  <!--             
      AddBookDocument abd = AddBookDocument.Factory.newInstance();
      AddBookDocument.AddBook ab = abd.addNewAddBook();
      ab.addAuthor("Cook, Glen");
      ab.setIsbn(isbn);
      ab.setType("scifi");
//            ab.setTitle(title);
      System.out.println("Validate returned " + abd.validate());
      stub.addBook(abd);
      ...

  <addBook xmlns="http://ws.sosnoski.com/library/wsdl">
   <type>scifi</type>
   <isbn>0445203498</isbn>
   <author>Cook, Glen</author>
  </addBook>
   
  <getBooksByTypeResponse xmlns="http://ws.sosnoski.com/library/wsdl">
   ...
   <getBooksByTypeReturn isbn="0445203498" type="scifi">
    <author xmlns="http://ws.sosnoski.com/library/types">Cook, Glen</author>
    <title xmlns="http://ws.sosnoski.com/library/types" xmlns:xsi="http://www.w3.org/2001
      /XMLSchema-instance" xsi:nil="true"/>
   </getBooksByTypeReturn>
  </getBooksByTypeResponse>
-->



这是未设置所需值的一个简单示例。对于更为复杂的模式,XMLBeans 生成的 API 可能会隐藏更多的缺陷。XMLBeans 用户邮件列表的最近一次讨论曾谈及这样的情况,即必须将值添加到两个不同的列表,以更改生成正确输出的顺序。因此 XMLBeans 要求开发人员既要了解模式,还要了解生成的代码如何与模式相关,以确保应用程序代码构建有效的 XML 文档。数据绑定框架的一个主要好处是,通常能够对开发人员隐藏模式的这些细节,而 XMLBeans 显然在这方面做得并不好。

可以通过调用生成类中包括的 validate() 方法来避免 XMLBeans 处理和生成无效 XML 文档的问题。如果使用 XMLBeans,则应至少在测试和开发期间使用此方法来检查所有文档。不过,验证对性能具有很大的影响(正如您在下一篇文章中将看到的,即使不对每个文档调用 validate(),XMLBeans 也已经非常慢了),因此很多应用程序都应该在生产部署中避免验证开销。就结果信息而言,验证也具有相当的局限性。为了避免导致验证错误,应该对出现错误的文档运行独立的模式验证。

JiBX

JiBX(我自己开发的)是主要侧重使用现有 Java 类(而不是从模式进行代码生成)的数据绑定框架。对于 JiBX,要首先创建绑定定义,以定义 Java 数据对象与 XML 之间如何转换,然后使用可通过添加实现转换的方法(作为字节码)来增强数据类文件的工具对该绑定进行编译。JiBX 运行时框架将随后使用这些添加的方法来在数据和 XML 之间进行转换。

JiBX 方法提供了一些独有的优势,也有自己独有的缺点。就好的一面而言,JIBX 可让您在 Web 服务接口添加到现有服务代码的情况下直接使用现有类。Jibx2Wsdl 工具特别适合这种用途,因为它会生成所需的所有内容,从而方便地将现有代码作为 Axis2 服务部署。可以在使用单个数据模型的情况下为相同的类定义不同的绑定,以同时用于文档的不同 XML 版本。通过修改绑定,甚至通常能在重构数据类的情况下保持相同的 XML 表示形式。

清单 9 显示了 JiBX 客户机代码中有意义的部分,其中使用了匹配消息元素的类。此代码与清单 5 中所示的 ADB 对等项类似,因此这里就不详细讨论了。唯一值得注意的差异是,由于数据类和消息类都在用户的控制之下,因此可以方便地向通过 JiBX 使用的类添加常规构造函数(如 AddBookRequest 的情况)和其他支持方法。


清单 9. JIBX 客户机代码
  <!--             
// create the server instance
JibxLibraryStub stub = new JibxLibraryStub(target);
       
// retrieve a book directly
String isbn = "0061020052";
GetBookResponse bresp = stub.getBook(new GetBookRequest(isbn));
Book book = bresp.getBook();
if (book == null) {
  System.out.println("No book found with ISBN '" + isbn + '\'');
} else {
  System.out.println("Retrieved '" + book.getTitle() + '\'');
}
isbn = "9999999999";
bresp = stub.getBook(new GetBookRequest(isbn));
book = bresp.getBook();
if (book == null) {
  System.out.println("No book found with ISBN '" + isbn + '\'');
} else {
  System.out.println("Retrieved '" + book.getTitle() + '\'');
}
       
// retrieve the list of types defined
GetTypesResponse tresp = stub.getTypes(new GetTypesRequest());
Type[] types = tresp.getTypes();
System.out.println("Retrieved " + types.length + " types:");
for (int i = 0; i < types.length; i++) {
  System.out.println(" '" + types[i].getName() + "' with " +
    types[i].getCount() + " books");
}
       
// add a new book
String title = "The Dragon Never Sleeps";
isbn = "0445203498";
try {
  AddBookRequest abr = new AddBookRequest("scifi", isbn, title,
    new String[] { "Cook, Glen" });
  stub.addBook(abr);
  System.out.println("Added '" + title + '\'');
  title = "This Should Not Work";
  abr = new AddBookRequest("scifi", isbn, title,
    new String[] { "Nobody, Ima" });
  System.out.println("Added duplicate book - should not happen!");
} catch (AddDuplicateFaultException e) {
  System.out.println("Failed adding '" + title +
  "' with ISBN '" + isbn + "' - matches existing title '" +
  e.getFaultMessage().getBook().getTitle() + '\'');
}
       
// create a callback instance
BooksByTypeCallback cb = new BooksByTypeCallback();
       
// retrieve all books of a type asynchronously
stub.startgetBooksByType(new GetBooksByTypeRequest("scifi"), cb);
long start = System.currentTimeMillis();
synchronized (cb) {
  while (!cb.m_done) {
    try {
      cb.wait(100);
    } catch (Exception e) {}
  }
}
System.out.println("Asynchronous operation took " +
  (System.currentTimeMillis()-start) + " millis");
if (cb.m_response != null) {
  Book[] books = cb.m_response.getBooks();
-->



清单 10 显示了对等的 JiBX 取消包装代码。和 ADB 取消包装代码类似,理解和使用服务调用的取消包装形式比使用直接代码简单得多。JiBX 和 ADB 版本唯一重要的区别在于,对于 JiBX,并不需要在不传递值时创建对象,而 getTypes() 调用的 ADB 版本则要求进行此工作。JiBX 取消包装支持也比 ADB 版本更为稳定一些,因为从 Axis2 1.1.1 起就提供了全面支持。


清单 10. JIBX 取消包装客户机代码
  <!--             
// create the server instance
JibxUnwrapLibraryStub stub = new JibxUnwrapLibraryStub(target);
       
// retrieve a book directly
String isbn = "0061020052";
Book book = stub.getBook(isbn);
if (book == null) {
  System.out.println("No book found with ISBN '" + isbn + '\'');
} else {
  System.out.println("Retrieved '" + book.getTitle() + '\'');
}
       
// retrieve the list of types defined
Type[] types = stub.getTypes();
System.out.println("Retrieved " + types.length + " types:");
for (int i = 0; i < types.length; i++) {
  System.out.println(" '" + types[i].getName() + "' with " +
    types[i].getCount() + " books");
}
       
// add a new book
String title = "The Dragon Never Sleeps";
isbn = "0445203498";
try {
  stub.addBook("scifi", isbn, new String[] { "Cook, Glen" }, title);
  System.out.println("Added '" + title + '\'');
  title = "This Should Not Work";
  stub.addBook("xml", isbn, new String[] { "Nobody, Ima" }, title);
  System.out.println("Added duplicate book - should not happen!");
} catch (AddDuplicateFaultException e) {
  System.out.println("Failed adding '" + title +
    "' with ISBN '" + isbn + "' - matches existing title '" +
    e.getFaultMessage().getBook().getTitle() + '\'');
}
       
// create a callback instance
BooksByTypeCallback cb = new BooksByTypeCallback();
       
// retrieve all books of a type asynchronously
stub.startgetBooksByType("scifi", cb);
long start = System.currentTimeMillis();
synchronized (cb) {
  while (!cb.m_done) {
    try {
      cb.wait(100L);
    } catch (Exception e) {}
  }
}
System.out.println("Asynchronous operation took " +
  (System.currentTimeMillis()-start) + " millis");
if (cb.m_books != null) {
  Book[] books = cb.m_books;
-->



JiBX 取消包装支持在使用的类方面也与 ADB 有差别。当使用 ADB 取消包装时,所有消息元素的类仍然在后台生成和使用。对于 JiBX,使用直接处理时必须将类定义为与消息元素对应,如清单 9 中所示;对于取消包装处理,只有作为值传递的类需要在绑定定义中加以定义和包括。无论采用哪种方法,JiBX 绑定定义都需要在运行 Axis2 WSDL2Java 工具前创建,而且需要使用 -Ebindingfile 命令行参数传入。

JiBX 绑定方法最大的缺陷(至少从 Web 服务方面可以这样说)可能就是,JiBX 目前对从 XML 模式定义工作的支持非常微弱。不过,即使是 Xsd2Jibx 工具提供的这个微弱支持,也尚未集成到 Axis2 WSDL2Java 代码生成中。这意味着需要在运行 WSDL2Java 生成 Axis2 链接代码前创建 Java 数据类和绑定定义。JiBX 所需的字节码增强步骤在某些环境中也可能出现问题,因为通常需要在应用程序构建时进行此工作,可在类中得到没有源代码可用的代码。

正如前面所提到的,JiBX 数据绑定提供了一些独特的好处。就 Axis2 使用而言,JiBX 也提供了优于其他框架的优势,即支持能够插入到 Axis2 版本中纠正发布之后发现的错误的错误修复程序版本(有关详细信息,请参见参考资料部分的“获得相关产品和技术”)。对于其他框架,获取错误修复程序的唯一方式就是迁移到 Axis2 的更高版本,而这样通常会带来其他问题。预计将来 JiBX 将提供稳定的从模式生成代码和绑定的支持。到提供此功能的那一天,就可以将 JiBX 视为 Axis2 的优秀全能数据绑定备选方案了。到那时,使用现有 Java 代码的做法将是最佳的,而 Jibx2Wsdl 工具恰恰在这方面提供了出色的支持。
分享到:
评论

相关推荐

    Axis2集成Spring.doc

    - 修改`web.xml`以确保Axis2 Servlet和其他Spring相关的配置正确无误。 3. **启动应用服务器:** - 部署应用到支持Servlet的应用服务器上,例如Tomcat。 4. **测试服务:** - 使用工具如Postman或SoapUI测试发布...

    Axis2创建webservice服务的方式 之 ADB 方式(二)

    配置Axis2以使用ADB数据绑定。这通常涉及到修改服务描述文件(如wsdl),以及服务部署描述文件(如services.xml)。你需要指定使用ADB作为数据绑定机制。 5. **打包服务**: 将服务相关的Java类、资源文件和配置...

    axis2示例工程

    "Axis2"是Apache Axis的下一代版本,是一个高性能、灵活且易于扩展的Web服务引擎,支持多种协议和绑定,如SOAP、RESTful等。"Spring"框架则是Java领域中最重要的框架之一,广泛应用于企业级应用开发,尤其在服务层面...

    AXIS2开发实例

    - **数据绑定**:AXIS2支持多种数据绑定技术,如ADB(AXIS Data Binding)、JAXB(Java Architecture for XML Binding),将XML数据自动映射为Java对象。 - **服务版本控制**:AXIS2支持服务版本化,可以发布新版本...

    axis2 开发webservice需要的完整jar

    - axis2-adb.jar:Axis2数据绑定模块,用于处理XML到Java对象的转换。 - axis2-kernel.jar:Axis2的核心模块,包含基本的服务处理逻辑。 - axis2-transport-http.jar:HTTP传输模块,用于处理HTTP请求和响应。 - ...

    spring3 + axis2

    Axis2支持多种Web服务标准,如SOAP、WSDL、WS-Addressing等,并且可以与各种数据绑定技术(如XMLBeans、Aegis、JAXB等)配合使用。此外,Axis2提供了丰富的扩展机制,允许自定义处理逻辑。 【Spring3与Axis2的整合...

    axis2 + spring3.2.0

    标题中的"axis2 + spring3.2.0"指的是在Java Web开发中,将Apache Axis2服务框架与Spring 3.2.0版本的依赖管理相结合的技术应用。Apache Axis2是一个用于构建Web服务和SOA(Service-Oriented Architecture,面向服务...

    axis2+EJB整合开发 源代码

    - Axis2的配置文件(如axis2.xml),用于配置服务发布、模块加载和传输协议等。 - 编译后的Java类文件和依赖库(JAR文件)。 - 可能还包括部署脚本、测试用例以及README文档,帮助理解和运行项目。 综合以上信息,...

    Axis2(WebService)经典教程.docx

    3. **services.xml文件发布WebService**:通过services.xml配置文件,开发者可以声明服务接口、操作和绑定,实现服务的发布和管理。 4. **会话(Session)管理**: Axis2提供了对WebService会话的支持,允许跨多个...

    web和axis2整合文档

    总结起来,Java Web项目与Axis2的整合涉及Web服务的创建、发布以及XML的相关知识,包括WSDL、SOAP、DOM解析等。通过这个过程,我们可以创建出跨平台、易于集成的Web服务,实现不同系统间的高效通信。

    Axis2(webservice)详细教程教程

    ### Axis2(webservice)详细教程知识点概览 #### 一、Axis2简介与特性 - **Axis2**是一款由Apache软件基金会维护和支持的开源WebService引擎。它在**Axis1.x**的基础上进行了全面升级和重构,支持**SOAP 1.1**和**...

    SSH2整合AXIS

    - **配置AXIS**:首先,要在项目中添加AXIS的依赖库,并设置相应的配置文件,如web.xml。 - **创建Web服务**:使用Java类定义服务接口和实现,AXIS会自动生成对应的SOAP绑定。 - **Spring管理Web服务**:将服务...

    java webservice_axis教程

    - **复杂对象类型**: Axis支持处理复杂数据类型,如Java Bean,可以通过 Axis 的数据绑定机制自动将XML消息与Java对象互相转换。 - **WebService会话管理**: Axis支持Session管理,使得跨多个WebService调用时可以...

    cxf+spring+axis包

    2. 创建Web服务:使用CXF的wsdl2java工具或者Axis的wsdl2java工具,从WSDL文件生成Java服务接口和服务实现。 3. 配置服务发布:在Spring配置文件中,通过CXF或Axis的配置元素,设置服务的地址和绑定信息。 4. 客户端...

    WebService之AXIS传递javabean.7z

    2. **生成Java stubs**:使用AXIS的WSDL2Java工具,你可以从Web服务的WSDL(Web Service Description Language)文件生成Java客户端和服务器端的存根(stubs)。这将为你的javabean创建对应的类型,并实现服务调用所...

    spring+axis集成webservice

    另一方面,Apache Axis是一个用于处理Web服务的Java库,它提供了从WSDL(Web服务描述语言)到Java代码的绑定,使得开发和部署Web服务变得更加简单。 **Spring与Axis集成的步骤** 1. **设置环境**:确保你的开发...

    struts2+hibernate+spring+axis jar

    同时,它支持OGNL(Object-Graph Navigation Language)表达式语言,使得数据绑定更加灵活。 **Hibernate** 是一个对象关系映射(ORM)框架,简化了数据库与Java对象之间的交互。它允许开发者将数据库操作转换为对...

    axis整合spring

    2. **创建Axis服务**:利用Axis的工具,如wsdl2java,从WSDL文件生成Java服务类和客户端 stubs。 3. **Spring Bean注册**:将Spring生成的Bean注册到Axis的Service中,通常通过实现SpringBeanAware接口或者自定义...

    java转wsdl方法

    你可以设置端点地址、传输协议、数据绑定等。同时,Axis2支持模块化,可以根据需求选择和组合不同的模块。 6. **WSDL转Java** 反向过程,即从已有的WSDL文件生成Java代码,也是可能的。Axis2的`WSDL2Java`工具同样...

Global site tag (gtag.js) - Google Analytics