CXF之"@XmlType.name 和 @XmlType.namespace 为类分配不同的名称"异常

解决CXF调用远程服务时XML类型名称冲突问题
本文解决在使用CXF调用远程服务时遇到的XML类型名称冲突导致的服务创建失败问题。通过修改接口类的XML类型名称,避免了类名重复,最终成功调用了远程服务。

情景描述:在我的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

.......................................

 

开始一直怀疑是因为我项目中的服务名与我调用的服务名之间有冲突,根据异常信息很容易让人如此思考;后来无意中打开一个接口文发现,原理我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

 

再将生成的接口COPY到相同的接口下,就不会再报错了。

 

总结:同样的异常也有可能别的原因引起的,这里只是其中一种可能.

 

2025-10-10 10:31:48.084 [main] INFO c.sinosoft.pic.sinopicdeal.test.aa - 短信平台 -- 异常:org.apache.cxf.service.factory.ServiceConstructionException javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:360) at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:349) at javax.xml.ws.Service.getPort(Service.java:169) at com.sinosoft.pic.sinopicdeal.webService.SendSMSServiceImplService.getSendSMSServiceImplPort(SendSMSServiceImplService.java:72) at com.sinosoft.pic.sinopicdeal.test.aa.main(aa.java:66) Caused by: org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:360) at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:87) at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:425) at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:527) at org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:262) at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:199) at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:103) at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91) at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:158) at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142) at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:492) at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:358) ... 4 more Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 6 counts of IllegalAnnotationExceptions 两个具有相同的 XML 名称 "{http://webservice.sinosoft.com/}sendSMSResponse"。请使用 @XmlType.name @XmlType.namespace分配不同名称。 this problem is related to the following location: at com.sinosoft.pic.sinopicdeal.webService.jaxws_asm.SendSMSResponse this problem is related to the following location: at com.sinosoft.pic.sinopicdeal.webService.SendSMSResponse at public javax.xml.bind.JAXBElement com.sinosoft.pic.sinopicdeal.webService.ObjectFactory.createSendSMSResponse(com.sinosoft.pic.sinopicdeal.webService.SendSMSResponse) at com.sinosoft.pic.sinopicdeal.webService.ObjectFactory 两个具有相同的 XML 名称 "{http://webservice.sinosoft.com/}sendSMSListResponse"。请使用 @XmlType.name @XmlType.namespace分配不同名称。 this problem is related to the following location: at com.sinosoft.pic.sinopicdeal.webService.jaxws_asm.SendSMSListResponse this problem is related to the following location: at com.sinosoft.pic.sinopicdeal.webService.SendSMSListResponse at public com.sinosoft.pic.sinopicdeal.webService.SendSMSListResponse com.sinosoft.pic.sinopicdeal.webService.ObjectFactory.createSendSMSListResponse() at com.sinosoft.pic.sinopicdeal.webService.ObjectFactory 两个具有相同的 XML 名称 "{http://webservice.sinosoft.com/}failedSendResponse"。请使用 @XmlType.name @XmlType.namespace分配不同名称。 this problem is related to the following location: at com.sinosoft.pic.sinopicdeal.webService.jaxws_asm.FailedSendResponse this problem is related to the following location: at com.sinosoft.pic.sinopicdeal.webService.FailedSendResponse at public javax.xml.bind.JAXBElement com.sinosoft.pic.sinopicdeal.webService.ObjectFactory.createFailedSendResponse(com.sinosoft.pic.sinopicdeal.webService.FailedSendResponse) at com.sinosoft.pic.sinopicdeal.webService.ObjectFactory
最新发布
10-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值