我一直在使用Apache CXF,特别是它支持的各种数据绑定:JAXB(默认),MTOM,Aegis和XMLBeans.由于所有这些都得到了支持,我认为每个都有它的优点.我想出了这些:
wsdl2java工具,所以它不太适合"契约优先"开发,即从WSDL开始并从中生成Java代码.我发现这个问题并列JAXB和XMLBeans,但它没有提供全面的概述:
除了这些天真的,先验的考虑之外,你是否有任何血腥经验可以支持使用除JAXB之外的任何其他绑定?我是从CXF的角度问的,但如果想到任何其他选择(例如Castor),请不要犹豫,详细说明.
我正在开发一个Web应用程序的一部分,它采用XML模式作为输入来生成XML文件.还有一些数据以有序的方式放入XML标记中.
例如,我将有一个100个数字的ArrayList,比如1到100
和.xsd看起来像下面的例子:
xs:element name ="elt1"
XS:复杂类型
xs:element name="elt1"
xs:complexType
xs:sequence
xs:element name="elt1-1"
xs:element name="elt1-2"
xs:element name="elt1-3"
xs:element name="elt1-4"
xs:element name="elt1-5"
xs:sequence
xs:complexType
xs:element name="elt1"
......other elements
Run Code Online (Sandbox Code Playgroud)
XS:复杂类型
xs:element name ="elt1"
......其他元素
如何生成如下所示的XML文件:
<elt1>
<elt1-1> 1 <elt1-1>
<elt1-2> 2 <elt1-2>
<elt1-2> 3 <elt1-3>
<elt1-4> 4 <elt1-4>
<elt1-5> 3 <elt1-5>
<elt1>
以便每个标签中的数据是arraylist中相应的数字,与arraylist中的数据顺序相同?
我真的很感激任何建议或exmaple.提前致谢!
我在一个Web应用程序上工作,从其代码中调用多个Web服务客户端.
每个Web服务都有一些常见的命名空间,但是当我生成每个客户端时,我正在将这些命名空间映射到不同的包
例如
Web Service 1的namespace1 - > com.company.webservice.client1.service
Web Service 2的namespace1 - > com.company.webservice.client2.service
其中namespace1引用相同的命名空间URL.
使用Wsdl2Java的namespace2package选项:
// Web Service Client 1's namespace parameter
--namespace2package http://www.multispeak.org/Version_3.0=com.company.webservice.client1.service
// Web Service Client 2's namespace parameter
--namespace2package http://www.multispeak.org/Version_3.0=com.company.webservice.client2.service
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地为这些服务生成Web服务客户端代码,只要生成的客户端jar中只有一个在给定Web服务调用的类路径上,我就可以自己调用每个客户端.但是,如果我将两个Web服务客户端jar放在类路径上,则只有一个Web服务客户端可以工作(其各自的客户端jar首先在类路径上).
尝试调用时,其他Web服务客户端失败,但以下情况除外:
java.lang.ClassCastException:com.company.webservice.client1.service.impl.GetAllMetersResponseDocumentImpl无法强制转换为com.company.webservice.client2.service.GetAllMetersResponseDocument
我已经混淆了上面的一些实际值.
因此,问题似乎是关于Axis2/XMLBeans如何查找适当的类以匹配给定的XML来解析.
我可以更改命名空间映射,以便它们相互匹配,之后它可以正常工作.但是,缺点是我在同一个包结构中有多个包含相同生成代码的Web服务客户端jar,这些类只能从它在类路径中找到的第一个客户端jar中的模型中实例化.
有没有办法这样做,以便我可以为每个Web服务客户端jar保留不同的命名空间?
或者我只是被迫将每个命名空间映射到使用该命名空间的每个客户端的同一个包?
希望这个问题有意义,但是如果我需要提供其他任何有用的东西,请告诉我,我将进一步详细说明这个问题,但希望有使用Wsdl2Java的Axis2/XMLBeans/web服务客户端生成知识的人应该是能够在没有更多信息的情况下回答这个
更新1: 我终于放弃了,只是使所有的命名空间映射指向同一个包而不是每个Web服务客户端的定制,并且在类路径上的各个JAR中获得了同一个类的多个副本.不像我希望的那样优雅,但至少它有效.
如果有人能想出一个更好的解决方案,允许我在每个客户端使用定制副本,请告诉我.
更新2: 这种方法同样不起作用,因为尽管使用相同的命名空间,两个Web服务产生不同版本的命名空间模型,现在导致编译时错误依赖于类路径顺序.那么......回到原点......
我只是想知道是否有人在获取XMLBeans(或任何其他生成器)上使用android 有任何成功.如果我可以使用它会非常好,因为我有一个非常大的模式,我宁愿不用手写所有的类.
我曾经在android开发者邮件列表上询问过这个问题,但没有人回复.这告诉我,要么他们不关心,要么没有人觉得它不可能告诉我.
如果有人知道其他类似的东西XMLBeans适用于Android,请告诉我.这将非常有帮助.
谢谢,罗比
我开始使用apache CXF 2.1.5和xmlbeans来生成Web服务客户端.FAQ页面显示了如何使用jaxb绑定来java.util.Date绑定xsd:dateTime:
<jaxws:bindings wsdlLocation="YOUR_WSDL_LOCATION"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='THE_NAMESPACE_OF_YOUR_SCHEMA']">
<jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:javaType name="java.util.Date" xmlType="xs:dateTime"
parseMethod="org.apache.cxf.tools.common.DataTypeAdapter.parseDateTime"
printMethod="org.apache.cxf.tools.common.DataTypeAdapter.printDateTime"/>
</jxb:globalBindings>
</jaxws:bindings>
</jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)
我想使用xmlBeans绑定,但找不到合适的示例.我理解如何使用xmlbeans将xml文件映射到java对象,但我找不到要使用的语法cxf.任何指针,代码样本都是受欢迎的.
XML Schema 1.1版本的非常好的有趣功能对我的用例非常有用.但是,它似乎相对较新.因此,在最终确定决定之前,我想回答以下问题.
问候.
使用这个简化的 XSD(简化,但仍然像所有 XSD 一样冗长):
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="[redacted]">
<xsd:element name="Statement" type="BILLINGSTATEMENTTYPEType"/>
<xsd:complexType name="BILLINGSTATEMENTTYPEType">
<xsd:sequence>
<xsd:element name="AccountSection" type="ACCOUNTSECTIONTYPEType"/>
<xsd:element name="DataSection" type="DATASECTIONTYPEType"/>
<xsd:element name="Summary" type="SUMMARYTYPEType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ACCOUNTSECTIONTYPEType">
<xsd:sequence>
<xsd:element name="Foo" type="xsd:string" maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="DATASECTIONTYPEType">
<xsd:sequence>
<xsd:element name="Bar" type="xsd:string" maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SUMMARYTYPEType">
<xsd:sequence>
<xsd:element name="Baz" type="xsd:string" maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)
我生成了一个 JAR 文件(使用<xmlbean>xmlbeans 中的 Ant 任务),一切看起来都很棒,我得到了所有正确的类型等等。但是当我让它解析这个简化的文档时:
<Statement>
<AccountSection>
<Foo>bar</Foo>
</AccountSection>
<DataSection>
</DataSection>
<Summary>
</Summary>
</Statement>
Run Code Online (Sandbox Code Playgroud)
使用此代码:
public class XmlTest …Run Code Online (Sandbox Code Playgroud) 我试图在一个项目中生成两个xmlbeans.例如,每一个都获得参与者对象,因此我不能将它们放在一个配置中.我的方式是使用两次执行,这是我的pom文件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xmlbeans-maven-plugin</artifactId>
<version>2.3.3</version>
<executions>
<execution>
<id>xmlbean1</id>
<phase>generate-sources</phase>
<goals>
<goal>xmlbeans</goal>
</goals>
<configuration>
<xmlConfigs>
<xmlConfig implementation="java.io.File">src/main/xsdconfig/xmlbean1</xmlConfig>
</xmlConfigs>
<verbose>true</verbose>
<schemaDirectory>src/main/xsd/xmlbean1</schemaDirectory>
</configuration>
</execution>
<execution>
<id>xmlbean2</id>
<phase>generate-sources</phase>
<goals>
<goal>xmlbeans</goal>
</goals>
<configuration>
<xmlConfigs>
<xmlConfig implementation="java.io.File">src/main/xsdconfig/xmlbean2</xmlConfig>
</xmlConfigs>
<verbose>true</verbose>
<schemaDirectory>src/main/xsd/xmlbean2</schemaDirectory>
</configuration>
</execution>
</executions>
<inherited>true</inherited>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但它根本不起作用.有人可以帮助我,谢谢
使用Axis2 Wsdl2Java:有没有办法从wsdl生成相关的客户端代码,但只能用于wsdl中受支持的操作的子集.
也就是说,如果wsdl说过一个有争议的操作,那么只能为一个或两个感兴趣的操作生成客户端存根代码?
我已经为客户WSDL生成了客户端存根,并且生成的存根和支持代码对于我的目的来说太大了> 75MB.
我使用了带有-U选项的Axis2 Wsdl2Java来解压缩绑定,并且由于在尝试使用ADB时出现解析错误,我还必须使用XML bean绑定.
谢谢,
由于我没有收到太多关于此的反馈:我将编辑这个来重述问题,(因为我真的不关心解决方案是如何得出的).
基本上我真正的问题是我正在生成一个相当大的WAR文件,该文件在Tomcat7.0中使用客户端并且它消耗了大量内存.
也许,我不需要/不应该在WAR中捆绑所有生成的类.但在我看来,这些是Stub生成的不可或缺的部分,我相信有一个更优雅的解决方案,而不是我手动挑选出来的东西?
所以我想以另一种方式重述问题:Axis2正在生成一个非常大的WAR文件,它消耗了大量的Tomcat资源.如何缩小此WAR以使其更小/"更轻量级"WAR.
谢谢,
在NetBeans中,我创建了一个Exporter类,它使用APACHE POI将一些数据导出到EXCEL文件,后者使用XMLBeans.
我通过下载zip二进制文件并手动添加jar来添加APACHE POI 3.10.1库.
当我在同一个项目中使用这个类时,一切都正常运行.
然后我通过右键单击Libraries - > Add Project将此类添加到另一个项目中.
但是当我尝试运行时,我在编译时遇到以下错误.
Signing JAR: C:\Users\c\p\dist\lib\xmlbeans-2.6.0.jar to C:\Users\c\p\dist\lib\xmlbeans-2.6.0.jar as nb-jfx
jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: org/apache/xmlbeans/xml/stream/Location.class
Enter Passphrase for keystore: Enter key password for nb-jfx:
C:\Users\c\p\nbproject\jfx-impl.xml:1465: The following error occurred while executing this line:
C:\Users\c\p\nbproject\jfx-impl.xml:2968: The following error occurred while executing this line:
C:\Users\c\p\nbproject\jfx-impl.xml:1940: jarsigner returned: 1
Run Code Online (Sandbox Code Playgroud)
我不知道这可能是什么,但让我发疯.