我编写了一些代码来使用 CXF 创建和运行 Web 服务客户端。我使用 JaxWsClientFactoryBean (不确定它是否是最佳解决方案)从 .wsdl 文件创建客户端。这里的目标是以编程方式避免使用 Spring 等。只需使用 Java 和 CXF 编写纯代码。
JaxWsClientFactoryBean cfb = new JaxWsClientFactoryBean();
cfb.setAddress(getServiceProperty(intClass, PROPERTY_KEY_URL_SUFFIX));
cfb.setServiceClass(intClass);
cfb.setOutInterceptors(getOutInterceptors(intClass));
cfb.setServiceName(SERVICE_NAME);
cfb.setWsdlURL("classpath:wsdl/" + intClass.getSimpleName() + ".wsdl");
cfb.setEndpointName(ENDPOINT_NAME);
Client client = cfb.create();
ClientProxy cp = new ClientProxy(client);
I intService = (I)
Proxy.newProxyInstance(intClass.getClassLoader(), new Class[] { intClass }, cp);
我真的不确定这是否正确完成,但是当我在本地运行此代码以及在 Tomcat 上部署它时它可以工作。
不幸的是,我需要在 Weblogic 上运行此代码,这会导致奇怪的异常:
Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was
made to insert a node where it is not permitted.
at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:235)
at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:186)
at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92)
... 26 more
Caused by: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.
at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:356)
at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:284)
at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.java:399)
at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:235)
at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:1019)
at org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:939)
at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:866)
at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:226)
... 28 more
这发生在应用程序部署期间。看起来 .wsdl 文件有问题,但是等等……它在 Tomcat 上运行!
我认为 Weblogic 中的 com.sun.org.apache.xerces.* 类实现与它的 JRockit VM 和标准 JVM 可能存在一些差异,但我不知道如何解决它。
我花了很多时间尝试不同的客户端创建方式。他们中的大多数在本地和 Tomcat 中工作,但在 WebLogic 上没有。
任何提示下一步该尝试什么?我有点厌倦这个话题:D