Генерация кода из WSDL вызывает исключение

#java #wsdl #code-generation #axis2 #wsdl2java

#java #wsdl #генерация кода #apache-axis #wsdl2java

Вопрос:

Я использую Axis2 1.5.1 (wsdl2java) для генерации кода (клиентских заглушек) из данного файла WSDL.
Веб-сервис предоставляется внешним приложением.

 <?xml version="1.0" encoding="utf-8"?>  
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility- 1.0.xsd"  
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"   
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"             
xmlns:tns="http://tempuri.org/"   
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"     
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
xmlns:i0="http://schemas.microsoft.com/ws/2005/02/mex/bindings" 
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" 
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"   
xmlns:wsa10="http://www.w3.org/2005/08/addressing"   
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"   
name="service" targetNamespace="http://tempuri.org/"   
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">  
<wsdl:types>  
<xsd:schema targetNamespace="http://tempuri.org/Imports">  
<xsd:include schemaLocation="SampleApp.App.ApplicationManager.RemoteApplication0.xsd" />  
<xsd:include schemaLocation="SampleApp.App.ApplicationManager.RemoteApplication1.xsd" />  
<xsd:include schemaLocation="SampleApp.App.ApplicationManager.RemoteApplication2.xsd" />  
<xsd:include schemaLocation="SampleApp.App.ApplicationManager.RemoteApplication3.xsd" />  
</xsd:schema>  
</wsdl:types>  
...  
</wsdl:definition>  
  

Содержимое RemoteApplication0.xsd выглядит следующим образом:

 <?xml version="1.0" encoding="utf-8"?>  
<xs:schema xmlns:tns="http://schemas.microsoft.com/Message" 
elementFormDefault="qualified"  
targetNamespace="http://schemas.microsoft.com/Message"  
xmlns:xs="http://www.w3.org/2001/XMLSchema">  
<xs:complexType name="MessageBody">  
<xs:sequence>  
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any" />  
</xs:sequence>  
</xs:complexType>  
</xs:schema>  
  

командная строка:

 wsdl2java -ss -g -d adb -or -p com.sampleapp.ws.generated.client -uri SampleRemoteProcess.wsdl  
  

Процесс генерации вызывает исключение.
трассировка стека:

 Using AXIS2_HOME: C:developaxis2-1.5.1-binaxis2-1.5.1
Using JAVA_HOME: C:Program FilesJavajdk1.6.0_21
Retrieving document at 'C:tempSampleRemoteProcess.wsdl'.
Retrieving schema at 'SampleApp.App.ApplicationManager.RemoteApplication0.xsd', relative to 'file:/C:/temp/SampleRemoteProcess.wsdl'.
Retrieving schema at 'SampleApp.App.ApplicationManager.RemoteApplication1.xsd', relative to 'file:/C:/temp/SampleRemoteProcess.wsdl'.
Retrieving schema at 'SampleApp.App.ApplicationManager.RemoteApplication2.xsd', relative to 'file:/C:/temp/SampleRemoteProcess.wsdl'.
Retrieving schema at 'SampleApp.App.ApplicationManager.RemoteApplication3.xsd', relative to 'file:/C:/temp/SampleRemoteProcess.wsdl'.
[ERROR] org.apache.ws.commons.schema.XmlSchemaException:  

An included schema was announced to have the default target namespace  
or the target namespace http://tempuri.org/Imports,  
but has the target namespace http://schemas.microsoft.com/Message  
java.lang.RuntimeException: org.apache.ws.commons.schema.XmlSchemaException:  
An included schema was announced to have the default target namespace  
or the target namespace http://tempuri.org/Imports, but has the target namespace http://schemas.microsoft.com/Message  
at org.apache.ws.commons.schema.SchemaBuilder.resolveXmlSchema(SchemaBuilder.java:1904)  
at org.apache.ws.commons.schema.SchemaBuilder.resolveXmlSchema(SchemaBuilder.java:1927)  
at org.apache.ws.commons.schema.SchemaBuilder.handleInclude(SchemaBuilder.java:1653)  
at org.apache.ws.commons.schema.SchemaBuilder.handleXmlSchemaElement(SchemaBuilder.java:219)  
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:433)  
at org.apache.axis2.description.WSDLToAxisServiceBuilder.getXMLSchema(WSDLToAxisServiceBuilder.java:144)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.copyExtensibleElements(WSDL11ToAxisServiceBuilder.java:2319)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.processTypes(WSDL11ToAxisServiceBuilder.java:413)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.processTypes(WSDL11ToAxisServiceBuilder.java:402)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.populateService(WSDL11ToAxisServiceBuilder.java:346)  
at org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder.populateAllServices(WSDL11ToAllAxisServicesBuilder.java:107)  
at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.(CodeGenerationEngine.java:147)  
at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)  
at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)  
Caused by: org.apache.ws.commons.schema.XmlSchemaException:  
An included schema was announced to have the default target namespace  
or the target namespace http://tempuri.org/Imports  
but has the target namespace http://schemas.microsoft.com/Message  
at org.apache.ws.commons.schema.SchemaBuilder$2.validate(SchemaBuilder.java:1679)  
at org.apache.ws.commons.schema.SchemaBuilder.setNamespaceAttributes(SchemaBuilder.java:369)  
at org.apache.ws.commons.schema.SchemaBuilder.handleXmlSchemaElement(SchemaBuilder.java:134)  
at org.apache.ws.commons.schema.SchemaBuilder.build(SchemaBuilder.java:121)  
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:445)  
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:368)  
at org.apache.ws.commons.schema.SchemaBuilder.resolveXmlSchema(SchemaBuilder.java:1898)  
... 13 more  

Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationException: Error parsing WSDL  
at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.(CodeGenerationEngine.java:153)  
at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.java:35)  
at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.java:24)  
Caused by: org.apache.axis2.AxisFault:  
org.apache.ws.commons.schema.XmlSchemaException:  
An included schema was announced to have the default target namespace  
or the target namespace http://tempuri.org/Imports,  
but has the target namespace http://schemas.microsoft.com/Message  
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.populateService(WSDL11ToAxisServiceBuilder.java:396)  
at org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder.populateAllServices(WSDL11ToAllAxisServicesBuilder.java:107)  
at org.apache.axis2.wsdl.codegen.CodeGenerationEngine.(CodeGenerationEngine.java:147)  
... 2 more    

Caused by: java.lang.RuntimeException:  
org.apache.ws.commons.schema.XmlSchemaException:  
An included schema was announced to have the default target namespace  
or the target namespace http://tempuri.org/Imports,  
but has the target namespace http://schemas.microsoft.com/Message  
at org.apache.ws.commons.schema.SchemaBuilder.resolveXmlSchema(SchemaBuilder.java:1904)  
at org.apache.ws.commons.schema.SchemaBuilder.resolveXmlSchema(SchemaBuilder.java:1927)  
at org.apache.ws.commons.schema.SchemaBuilder.handleInclude(SchemaBuilder.java:1653)  
at org.apache.ws.commons.schema.SchemaBuilder.handleXmlSchemaElement(SchemaBuilder.java:219)  
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:433)  
at org.apache.axis2.description.WSDLToAxisServiceBuilder.getXMLSchema(WSDLToAxisServiceBuilder.java:144)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.copyExtensibleElements(WSDL11ToAxisServiceBuilder.java:2319)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.processTypes(WSDL11ToAxisServiceBuilder.java:413)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.processTypes(WSDL11ToAxisServiceBuilder.java:402)  
at org.apache.axis2.description.WSDL11ToAxisServiceBuilder.populateService(WSDL11ToAxisServiceBuilder.java:346)  
... 4 more  

An included schema was announced to have the default target namespace  
or the target namespace http://tempuri.org/Imports,  
but has the target namespace http://schemas.microsoft.com/Message  
at org.apache.ws.commons.schema.SchemaBuilder$2.validate(SchemaBuilder.java:1679)  
at org.apache.ws.commons.schema.SchemaBuilder.setNamespaceAttributes(SchemaBuilder.java:369)  
at org.apache.ws.commons.schema.SchemaBuilder.handleXmlSchemaElement(SchemaBuilder.java:134)  
at org.apache.ws.commons.schema.SchemaBuilder.build(SchemaBuilder.java:121)  
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:445)  
at org.apache.ws.commons.schema.XmlSchemaCollection.read(XmlSchemaCollection.java:368)  
at org.apache.ws.commons.schema.SchemaBuilder.resolveXmlSchema(SchemaBuilder.java:1898)  
... 13 more  
  

Кажется, есть проблема с пространством имен, но я не знаю, как это исправить.

Кто-нибудь может дать мне подсказку!

Ответ №1:

проблема в том, что вы используете «включить». схемы редактирования «include» должны иметь то же целевое пространство имен, что и схема, в которой находится включаемое (по сути, вы разбиваете одно и то же пространство имен на несколько файлов). вы должны «импортировать» схему, чтобы использовать другой файл схемы с другим целевым пространством имен.

Ответ №2:

Сообщение об ошибке довольно наглядное: схема, <include> отредактированная в другой схеме, всегда должна иметь то же целевое пространство имен, что и импортирующая схема. В файле RemoteApplication0.xsd необходимо изменить целевое пространство имен http://schemas.microsoft.com/Message на http://tempuri.org/Imports .

Комментарии:

1. Я уже пробовал это! Но я все еще получаю исключение: было объявлено, что включенная схема имеет целевое пространство имен по умолчанию или целевое пространство имен tempuri.org/Imports , но имеет целевое пространство имен tempuri.org

2.Итак? Это та же ошибка. Вы должны предоставить http://tempuri.org/Imports , не http://tempuri.org или что-то подобное.

3. Я использовал http://tempuri.org/Imports ! Но сообщение об исключении является http://tempuri.org/ . Я в полном замешательстве!

4. Я тоже. Не могли бы вы попробовать с wsimport (поставляется с каждым JDK) вместо wsdl2java ? Если все еще есть какая-то ошибка, возможно, вы могли бы обновить свой вопрос. Я не знаю, почему части пространства имен должны быть удалены.

5. @jtahlborn: Вы правы (и потребовалось некоторое время, пока кто-нибудь узнал), и я соответствующим образом отредактировал ответ.