我开始使用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.任何指针,代码样本都是受欢迎的.
我正在尝试使用eclipse Galileo和Windows xp上的轴2 1.4从本地WSDL文件生成代理类.我的问题是由于WSDL中导入的模式而导致错误.困扰我的那条线是:
<xsd:import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>
Run Code Online (Sandbox Code Playgroud)
我试过运行wsdl2java以下命令:
wsdl2java.bat -uri SOAService.wsdl -o D:\temp p test -d xmlbeans -a -s -ns2p -uw
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationException
: Error parsing WSDL
at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.<init>(CodeGenerat
ionEngine.java:156)
at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)
at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)
Caused by: javax.wsdl.WSDLException: WSDLException (at /wsdl:definitions/wsdl:ty
pes/xsd:schema): faultCode=OTHER_ERROR: An error occurred trying to resolve sche
ma referenced at 'http://www.w3.org/2005/05/xmlmime', relative to 'file:/D:/Prog
rammi/axis2-1.4/bin/SOAService.wsdl'.: java.net.ConnectException: Connection tim
ed out: connect
at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseTypes(Unknown Source)
at com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 我目前正在使用cxf 2.4.0,我的代码是webservice的调用者.我能够使用Maven中的cxf插件生成客户端java文件.我的问题是生成的文件的最佳实践是什么?我应该编译生成的文件并将生成的类文件打包到一个jar文件中,还是应该在构建路径中包含所有生成的java文件?
我被要求查看现有基于服务的应用程序的构建过程.它有几个基于服务的模块,其中一些服务由第三方提供.构建过程中使用的wsdls通过http降低到构建中.为了竞争,我使用maven 3和axistools-maven-plugin从wsdl生成类.
这开始让我思考.如果远程服务器关闭,我的构建将失败.如果wsdl更改我的构建也可能失败.我想要这个吗?远程wsdls在service/wsdl名称中进行了版本化,因此不应对API进行重大更改,但它们是第三方,我真的不能依赖此约定.
在本地下载wsdl并根据源代码管理的文件构建是不是更好?我会有一个适当的可重复构建,然后没有远程服务器不可用的危险.但这似乎并不敏捷.如果我采用这种方法,那么我如何才能知道远程wsdl中的任何变化?
我敢肯定,我不是第一个想从wsdls构建最佳实践的人.任何人都可以强调哪种机制被认为是从远程wsdls生成的服务生成可修复构建的最佳实践方式?
尝试从示例WSDL(使用CXF 2.7.1)构建演示合同优先服务:
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="OrderProcessService" targetNamespace="http://order.demo/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://order.demo/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://order.demo/" xmlns:tns="http://order.demo/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="processOrder" type="tns:processOrder" />
<xs:element name="processOrderResponse" type="tns:processOrderResponse" />
<xs:complexType name="processOrder">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="tns:order" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="order">
<xs:sequence>
<xs:element minOccurs="0" name="customerID" type="xs:string" />
<xs:element minOccurs="0" name="itemID" type="xs:string" />
<xs:element name="price" type="xs:double" />
<xs:element name="qty" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="processOrderResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="processOrderResponse">
<wsdl:part element="tns:processOrderResponse" name="parameters">
</wsdl:part> …Run Code Online (Sandbox Code Playgroud) 我的wsdl2java目标是cxf-codegen-plugin从WSDL生成Java。然后,在测试中,我使用JAXB.unmarshal()从原始Web服务XML结果中填充类。
一个典型的示例是GetAllResponseType response = unmarshal("get-all.xml", GetAllResponseType.class)使用以下方法:
<T> T unmarshal(String filename, Class<T> clazz) throws Exception {
InputStream body = getClass().getResourceAsStream(filename);
return javax.xml.bind.JAXB.unmarshal(body, clazz);
}
Run Code Online (Sandbox Code Playgroud)
问题是这样的:原始XML响应始终包含封闭的Envelope和Body标记,而这些标记不是由wsdl2java作为类生成的:
<n4:Envelope xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:n="http://www.informatica.com/wsdl/"
xmlns:n4="http://schemas.xmlsoap.org/soap/envelope/" xmlns:n5="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<n4:Body>
<n:getAllResponse xmlns:n="http://www.informatica.com/wsdl/">
<n:getAllResponseElement>
...
</n:getAllResponseElement>
</n:getAllResponse>
</n4:Body>
</n4:Envelope>
Run Code Online (Sandbox Code Playgroud)
因此,为了使用JAXB.unmarshal(),我必须
目前我做2,但是有很多代码:
<T> T unmarshal(String filename, Class<T> clazz) throws Exception {
InputStream is = getClass().getResourceAsStream(filename);
InputStream body = nodeContent(is, "n4:Body");
return javax.xml.bind.JAXB.unmarshal(body, clazz);
}
InputStream nodeContent(InputStream is, String …Run Code Online (Sandbox Code Playgroud) 我想使用wsdl从头开始创建一个apache cxf maven项目.我需要使用wsdl2java.我首先找不到wsdl的原型.当我尝试
mvn archetype:generate -Dfilter = org.apache.cxf.archetype:
我只看到这些.首先没有wsdl的原型吗?如果没有,有人可以推荐最有效的方法吗?谢谢
选择原型:1:remote - > org.apache.cxf.archetype:cxf-jaxrs-service(使用Spring配置的简单CXF JAX-RS webap p服务)2:remote - > org.apache.cxf.archetype:cxf-jaxws -javafirst(从Java代码开始创建用于开发Web服务的项目)
我正在从wsdl创建Java Web服务客户端.我使用Eclipses的Dynamic Web Project和新的Web Services Client来生成带有Apache Axis 1.4的wsdl2java的代码.我需要为此代码添加SOAP身份验证,以便它与服务一起使用.我在生成的代码中找不到这样做的地方.经过大量的研究,我发现了这个,到目前为止,我已经将其用作我的代码的主干.
在我收到"处理邮件安全性时发生错误"之前或其他方面.现在我来了
"例外:不明白"MustUnderstand"标题:{ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd }安全信息:空值"
我已经尝试了很多东西来克服这个异常.这是我现在到达的代码.
javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName);
header.setActor(null);
header.setMustUnderstand(true);
// Add the UsernameToken element to the WS-Security header
javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken");
utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1");
javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username");
userNameElem.setValue("username");
javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password");
passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordElem.setValue("password");
header.setProcessed(true);
// Finally, attach the header to the binding.
setHeader(header)
Run Code Online (Sandbox Code Playgroud)
此代码位于我的Binding_ServiceStub类中(在其"createCall方法"中).
我们使用这个wsdl在C#和VB中创建了客户端,并且只需更改ClientCredentials变量就可以轻松实现,该变量是生成的代理类的扩展.我希望这里有类似的东西.
这是wsdl代码中的安全策略.
<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy>
Run Code Online (Sandbox Code Playgroud)
有谁知道我还能在这做什么?为什么会发生这种异常?我已经尝试了很多不同的前缀和setProcesses以及setMustUnderstand值的组合都是徒劳的(并且基于我对此异常的研究).
如果有人知道在wsdl2java代码中添加Soap头认证的方法,我也会采取这种方式.只是需要这个工作,你会认为这样的事情会更直接或至少有更多的例子.
更新 - 确认使用SOAPUI传递的相同头文件正常工作.必须是框架的东西?我创建了一个自定义处理程序来处理SOAP消息,但这没有帮助.Axis 1.4和JAX-RPC是问题吗?(我知道他们已经过时但仍然......)
我有一个WSDL文件weatherservice.wsdl,我正在尝试使用生成与此WSDL的绑定xjc。如何使用xjc执行此操作?
我从xjc中找不到任何命令行参数来执行此操作。 xjc -p com -wsdl weatherservice.wsdl
我正在使用xsd,它使用以下结构:
<xs:attribute name="listVersionID" type="xs:normalizedString" use="required" fixed="1.0">
Run Code Online (Sandbox Code Playgroud)
虽然本身没有问题,但使用起来相当烦人,因为这个定义的固定值在xsd规范的发布之间增加,我们需要修改单独的常量类中的值以保持它们有效,尽管很少如果xsd感兴趣的内容发生了变化.xsd在其他地方维护,所以只是改变它是没有选择的.
因此我问自己是否有一个jaxb-plugin或类似的将固定值属性转换为常量ala
@XmlAttribute(name = "listVersionID")
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
@XmlSchemaType(name = "normalizedString")
protected final String listVersionID = "1.0";
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
@XmlAttribute(name = "listVersionID")
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
@XmlSchemaType(name = "normalizedString")
protected String listVersionID;
Run Code Online (Sandbox Code Playgroud)
必须手动填充.
有谁知道这样的?