5

我有以下配置maven-jaxb2-plugin

            <!-- https://mvnrepository.com/artifact/org.jvnet.jaxb2.maven2/maven-jaxb2-plugin -->
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.13.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <strict>false</strict>
                    <schemaLanguage>WSDL</schemaLanguage>
                    <generatePackage>com.mycompany.project.domain.wsdl</generatePackage>
                    <schemas>
                        <schema>
                            <url>url or file</url>
                        </schema>
                    </schemas>
                </configuration>
            </plugin>

它失败了:

[ERROR] Error while parsing schema(s).Location [ file:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl{2,366}].

org.xml.sax.SAXParseException;systemId:文件:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl;行号:2;列号:366;必须存在 JAXB 版本属性

如果我通过 IntelliJ IDEA 运行插件或做一个简单的mvn clean jax2b:generate. 但是,使用可以在此处找到的模式,该操作是成功的,所以我怀疑我的 wsdl 模式实际上格式不正确,我暂时无法公开,但可以通过消息提供(我知道这没有多大帮助按原样公开,但如果问题出在架构中,我将在此处发布相关的问题部分)。

注意: SOAP UI 也会验证模式。

注意 2:jax2b-maven-plugin和 都存在相同的错误maven-jax2b-plugin

4

1 回答 1

11

TL;DR您的 WSDL 不正确/不适合 XJC。您将需要 strup JAXB 自定义或添加xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.1"到根元素。

问题是您的 WSDL 在包含的模式中包含大量 JAXB 自定义。这是一个坏主意。JAXB 定制是特定于供应商的东西,无论谁将它们放入 WSDL(应该是与供应商无关的规范)都没有做正确的事情。

现在的问题是 XJC,当您有内联 JAXB 定制时,JAXB 模式编译需要某些花里胡哨。Likejaxb:version根元素上的属性。在这种情况下,这是缺失的。它出现在schema元素上,但不在根wsdl:definitions元素上。如果添加它,则编译成功。

这与 JAXB 插件无关。如果你尝试xjc -wsdl delivery.wsdl,你会得到同样的错误。

可能有一些神奇的选项可以抑制这个问题,但很难弄清楚。所以我建议修补 WSDL。在预代码生成步骤中创建补丁并将其应用到 WSDL。我个人会从 WSDL 中删除所有 JAXB 自定义,因为他们实际上什么都没有忘记。

于 2017-03-20T21:21:52.220 回答