Ошибка JAX-WS в файле WSDL: "Ошибка разрешения компонента s: схема"
Ошибка
Я использую wsimport в проекте Java для создания исходных текстов для трех веб-служб SOAP. Первые два работают нормально: я использую плагин JAX-WS Maven, чтобы получить файл WSDL и сгенерировать соответствующие исходные файлы Java.
Это не работает для одного веб-сервиса; Я получаю следующую ошибку:
[jaxws:wsimport]
Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
jaxws:wsimport args: [-s, /home/me/NetBeansProjects/Admin/AdminWeb/target/generated-sources/jaxws-wsimport, -d, /home/me/NetBeansProjects/Admin/AdminWeb/target/classes, -verbose, -catalog, /home/me/NetBeansProjects/Admin/AdminWeb/src/jax-ws-catalog.xml, -wsdllocation, http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx?WSDL, -target, 2.0, -extension, -Xnocompile, /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl]
parsing WSDL...
src-resolve.4.2: Error resolving component 's:schema'. It was detected that 's:schema' is in namespace 'http://www.w3.org/2001/XMLSchema', but components from this namespace are not referenceable from schema document 'file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1'. If this is the incorrect namespace, perhaps the prefix of 's:schema' needs to be changed. If this is the correct namespace, then an appropriate 'import' tag should be added to 'file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1'.
line 80 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl#types?schema1
undefined element declaration 's:schema'
line 80 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
undefined element declaration 's:schema'
line 127 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
undefined element declaration 's:schema'
line 142 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
Виновник
Разница между этим файлом WSDL и тем, что работает, заключается в том, что в строках, отмеченных в сообщении об ошибке, в строках 80, 127 и 142:
<s:element ref="s:schema" />
Примечание: корневой элемент файла wsdl определяет пространство имен "s" таким образом:
xmlns:s="http://www.w3.org/2001/XMLSchema"
Что я пробовал
Я сделал свое исследование. Похоже, у других людей были похожие проблемы с решениями от "просто не используйте" <s:element ref="s:schema" />
", чтобы использовать тег импорта", к какому-то неизвестному решению, которое, по-видимому, находилось на старом форуме java.net (до того, как оно было снято, поджог современной александрийской библиотеки знаний Java).
Я попытался поместить следующий оператор импорта только внутри элемента, который содержит теги проблемы:
<s:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd" />
, wsimport дает мне новую ошибку:[jaxws:wsimport] Processing: /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl jaxws:wsimport args: [-s, /home/me/NetBeansProjects/Admin/AdminWeb/target/generated-sources/jaxws-wsimport, -d, /home/me/NetBeansProjects/Admin/AdminWeb/target/classes, -verbose, -catalog, /home/me/NetBeansProjects/Admin/AdminWeb/src/jax-ws-catalog.xml, -wsdllocation, http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx?WSDL, -target, 2.0, -extension, -Xnocompile, /home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl] parsing WSDL... Element "{http://www.w3.org/2001/XMLSchema}annotation" shows up in more than one properties. line 248 of http://www.w3.org/2001/XMLSchema.xsd The following location is relevant to the above error line 242 of http://www.w3.org/2001/XMLSchema.xsd Property "Any" is already defined. Use <jaxb:property> to resolve this conflict. line 108 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl The following location is relevant to the above error line 109 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl Property "Any" is already defined. Use <jaxb:property> to resolve this conflict. line 184 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl The following location is relevant to the above error line 185 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl Property "Any" is already defined. Use <jaxb:property> to resolve this conflict. line 199 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl The following location is relevant to the above error line 200 of file:/home/me/NetBeansProjects/Admin/AdminWeb/src/wsdl/erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl
Строки 108 и 109, на которые ссылаются в этой ошибке: (строки 184-5, 199-200 похожи)
<s:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" /> <s:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax" />
Я попытался обновить jaxws-maven-plugin с 1.10 до 2.2. Та же проблема.
- Вот возможное решение - я пытаюсь выяснить, как реализовать это с помощью плагина JAX-WS Maven. Есть намеки?
Заключение
Есть идеи? Любая дополнительная информация вам нужна? Для краткости я опустил файлы pom.xml и Service.asmx.wsdl, но мог бы включить их, если в них есть более важная информация.
Спасибо!
Addenda
Вот другой человек, имеющий такую же проблему, если это полезно для любых потенциальных ответчиков. Вот еще одна похожая проблема. Я не очень понимаю эту статью, но, похоже, это подразумевает, что мне нужно разобрать SOAP XML вручную! Фильм ужасов!
5 ответов
Я решил эту проблему, адаптировав метод Вивека Пандея к Maven и обновив его до jaxws-maven-plugin 2.2. Я повторю это здесь для потомков:
Резюме
Поместите этот файл настройки XJB (см. Ниже) в каталог файлов привязки по умолчанию и установите wsimport для его привязки и http://www.w3.org/2001/XMLSchema.xsd.
Настройка XJB
Содержимое вышеупомянутого XML-файла xsd.xjb, которое должно находиться в каталоге файлов привязки по умолчанию, выглядит следующим образом (кредит идет на Kohsuke):
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
version="2.0">
<globalBindings>
<xjc:simple />
</globalBindings>
<bindings scd="~xsd:complexType">
<class name="ComplexTypeType"/>
</bindings>
<bindings scd="~xsd:simpleType">
<class name="SimpleTypeType"/>
</bindings>
<bindings scd="~xsd:group">
<class name="GroupType"/>
</bindings>
<bindings scd="~xsd:attributeGroup">
<class name="AttributeGroupType"/>
</bindings>
<bindings scd="~xsd:element">
<class name="ElementType"/>
</bindings>
<bindings scd="~xsd:attribute">
<class name="attributeType"/>
</bindings>
</bindings>
POM
Вот соответствующая часть моего файла POM с отмеченными изменениями:
<plugin>
<!-- CHANGE: updated groupId and version -->
<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- CHANGE: added args tag to bind http://www.w3.org/2001/XMLSchema.xsd -->
<args>
<arg>-b</arg><arg>http://www.w3.org/2001/XMLSchema.xsd</arg>
</args>
<wsdlFiles>
<wsdlFile>erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl</wsdlFile>
</wsdlFiles>
<wsdlLocation>http://erp-app-devel.srv.mycompany.ca/EgTestReportEngine/Service.asmx.wsdl</wsdlLocation>
<staleFile>${project.build.directory}/jaxws/stale/Service.asmx.stale</staleFile>
<!-- CHANGE: added bindingFiles tag to bind XJB customization, located at the default binding files directory, MyProject/src/jaxws/xsd.xjb . -->
<bindingFiles>
<bindingFile>xsd.xjb</bindingFile>
</bindingFiles>
</configuration>
<id>wsimport-generate-egtestreportengine</id>
<phase>generate-sources</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>webservices-api</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<configuration>
<sourceDestDir>${project.build.directory}/generated-sources/jaxws-wsimport</sourceDestDir>
<xnocompile>true</xnocompile>
<verbose>true</verbose>
<extension>true</extension>
<catalog>${basedir}/src/jax-ws-catalog.xml</catalog>
<target>2.0</target>
</configuration>
</plugin>
Чтобы решение Ника работало, вам, возможно, придется добавить эти два аргумента jvm в ваш файл pom.xml. Поэтому при возникновении таких ошибок:
org.xml.sax.SAXParseException; systemId: http://www.w3.org/2001/XMLSchema.xsd; номер строки: 67; номер столбца: 11; Внешнее DTD: не удалось прочитать внешнее DTD "XMLSchema.dtd", так как доступ "http" не разрешен из-за ограничений, установленных свойством accessExternalDTD.
[WARNING] schema_reference: Не удалось прочитать документ схемы 'xml.xsd', поскольку доступ по http не разрешен из-за ограничений, установленных свойством accessExternalSchema. строка 91 http://www.w3.org/2001/XMLSchema.xsd
Просто добавьте их в свой pom.xml
-Djavax.xml.accessExternalDTD=all
-Djavax.xml.accessExternalSchema=all
<vmArgs>
<vmArg>-Djavax.xml.accessExternalDTD=all</vmArg>
<vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
</vmArgs>
Если бы та же проблема была исправлена с помощью следующей команды:
wsimport -b http://www.w3.org/2001/XMLSchema.xsd -b xsd.xjb service.wsdl
где xsd.xjb
относится к:
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
version="2.0">
<globalBindings>
<xjc:simple />
</globalBindings>
<bindings scd="~xsd:complexType">
<class name="ComplexTypeType"/>
</bindings>
<bindings scd="~xsd:simpleType">
<class name="SimpleTypeType"/>
</bindings>
<bindings scd="~xsd:group">
<class name="GroupType"/>
</bindings>
<bindings scd="~xsd:attributeGroup">
<class name="AttributeGroupType"/>
</bindings>
<bindings scd="~xsd:element">
<class name="ElementType"/>
</bindings>
<bindings scd="~xsd:attribute">
<class name="attributeType"/>
</bindings>
</bindings>
Если вы на самом деле не заботитесь об этом конкретном бите данных модели, вы можете использовать файл привязок JAXB, чтобы сообщить JAXB о необходимости сопоставления битов-нарушителей со свойствами, тип которых является DOM. Element
вместо того, чтобы пытаться связать их в обычные классы JAXB. В неофициальном руководстве JAXB есть раздел, посвященный этой технике.
Это, кажется, работает для меня, наконец. Я использую плагин apache maven cfx
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<additionalJvmArgs>
-Djavax.xml.accessExternalDTD=all
</additionalJvmArgs>
<sourceRoot>${basedir}/src/main/generated</sourceRoot>
<wsdlOptions>
<wsdlOption>
<extraargs>
<extraarg>-autoNameResolution</extraarg>
<extraarg>-impl</extraarg>
<extraarg>-verbose</extraarg>
<extraarg>-b</extraarg>
<extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>
<extraarg>-p</extraarg>
<extraarg>com.nevado.travelstudio</extraarg>
</extraargs>
<!-- <bindingFiles> <bindingFile>${basedir}/src/main/resources/wsdl/mybindings.xjb</bindingFile>
</bindingFiles> -->
<wsdl>${basedir}/src/main/resources/wsdl/B2.wsdl</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
вместе с этими изменениями мне пришлось создать файл jaxp.properties в папке..java/jdk/jre/lib со следующим свойством
-Djavax.xml.accessExternalDTD=all