情景描述:在我的webservice服务中,要调用远程写好的一个服务;由于我的后台是用CXF方式开发的,所以调用远程的方式采用的是由wsdl生成本地代理接口来实现的,生成本地接口的代码如下:
F:\jar包驱动\apache-cxf-2.6.0\bin>wsdl2java -p com.dyc.client -d d:/ws -verbose http://localhost:7000/gisplatform/SpatialAnalysisService?wsdl
然后将生成的在ws目录下的源文件copY到我的工程中调用,报下面错误
信息: Creating Service {http://www.sgcc.com.cn/sggis/service/gisservice}Spatialanalysisserviceservice from class cn.creaway.webgis.proxy.SpatialAnalysisService Exception in thread "main" org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:297) at org.apache.cxf.service.factory.AbstractServicefactorybean.initializeDataBindings(AbstractServicefactorybean.java:86) at org.apache.cxf.service.factory.ReflectionServicefactorybean.buildServiceFromClass(ReflectionServicefactorybean.java:474) at org.apache.cxf.jaxws.support.JaxWsServicefactorybean.buildServiceFromClass(JaxWsServicefactorybean.java:685) at org.apache.cxf.service.factory.ReflectionServicefactorybean.initializeServiceModel(ReflectionServicefactorybean.java:536) at org.apache.cxf.service.factory.ReflectionServicefactorybean.create(ReflectionServicefactorybean.java:248) at org.apache.cxf.jaxws.support.JaxWsServicefactorybean.create(JaxWsServicefactorybean.java:205) at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101) at org.apache.cxf.frontend.Clientfactorybean.create(Clientfactorybean.java:90) at org.apache.cxf.frontend.ClientProxyfactorybean.create(ClientProxyfactorybean.java:155) at org.apache.cxf.jaxws.JaxWsProxyfactorybean.create(JaxWsProxyfactorybean.java:156) at cn.creaway.webgis.business.SpatialAnalysisServiceBusiness.computeUserLineLengthStatisticByDept(SpatialAnalysisServiceBusiness.java:71) at cn.creaway.webgis.business.SpatialAnalysisServiceBusiness.main(SpatialAnalysisServiceBusiness.java:85) Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 3 counts of IllegalAnnotationExceptions 两个类具有相同的 XML 类型名称 "{http://www.sgcc.com.cn/sggis/service/gisservice}computePSRStatisticByDept"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。 this problem is related to the following location: at cn.creaway.webgis.proxy.jaxws_asm.ComputePSRStatisticByDept this problem is related to the following location: at cn.creaway.webgis.proxy.ComputePSRStatisticByDept at public cn.creaway.webgis.proxy.ComputePSRStatisticByDept cn.creaway.webgis.proxy.ObjectFactory.createComputePSRStatisticByDept() at cn.creaway.webgis.proxy.ObjectFactory 两个类具有相同的 XML 类型名称 "{http://www.sgcc.com.cn/sggis/service/gisservice}computeLineLengthStatisticByDeptResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。 this problem is related to the following location: at cn.creaway.webgis.proxy.jaxws_asm.ComputeLineLengthStatisticByDeptResponse this problem is related to the following location: at cn.creaway.webgis.proxy.ComputeLineLengthStatisticByDeptResponse at public cn.creaway.webgis.proxy.ComputeLineLengthStatisticByDeptResponse cn.creaway.webgis.proxy.ObjectFactory.createComputeLineLengthStatisticByDeptResponse() at cn.creaway.webgis.proxy.ObjectFactory 两个类具有相同的 XML 类型名称 "{http://www.sgcc.com.cn/sggis/service/gisservice}computePSRStatisticByDeptResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。 this problem is related to the following location: at cn.creaway.webgis.proxy.jaxws_asm.ComputePSRStatisticByDeptResponse this problem is related to the following location: at cn.creaway.webgis.proxy.ComputePSRStatisticByDeptResponse at public cn.creaway.webgis.proxy.ComputePSRStatisticByDeptResponse cn.creaway.webgis.proxy.ObjectFactory.createComputePSRStatisticByDeptResponse() at cn.creaway.webgis.proxy.ObjectFactory at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:106) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:466) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:298) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:141) at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1163) at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:145) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:211) at javax.xml.bind.ContextFinder.find(ContextFinder.java:372) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) at org.apache.cxf.common.jaxb.JAXBContextCache$2.run(JAXBContextCache.java:268) at org.apache.cxf.common.jaxb.JAXBContextCache$2.run(JAXBContextCache.java:267) at java.security.AccessController.doPrivileged(Native Method) at org.apache.cxf.common.jaxb.JAXBContextCache.createContext(JAXBContextCache.java:266) at org.apache.cxf.common.jaxb.JAXBContextCache.getCachedContextAndSchemas(JAXBContextCache.java:172) at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContextAndSchemas(JAXBDataBinding.java:427) at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:295) ... 12 more
开始一直怀疑是因为我项目中的服务名与我调用的服务名之间有冲突,根据异常信息很容易让人如此思考;后来无意中打开一个接口文发现,原来我copY到工程中时,包的路径改变了,而原接口引用的类路径却还是我生成时用的目录,如下:
...................................................... @ResponseWrapper(localName = "computePSRStatisticByDeptResponse",targetNamespace = "http://www.sgcc.com.cn/sggis/service/gisservice",className = "com.dyc.client.ComputePSRStatisticByDeptResponse") public java.lang.String computePSRStatisticByDept( @WebParam(name = "InputXML",targetNamespace = "") java.lang.String inputXML); .......................................................
可以发现我的className一直引用的是我原来的包名,而我现在的包名是cn.gary.test
F:\jar包驱动\apache-cxf-2.6.0\bin>wsdl2java -p cn.gary.test -d d:/ws -verbose http://localhost:7000/gisplatform/SpatialAnalysisService?wsdl
总结:同样的异常也有可能别的原因引起的,这里只是其中一种可能.