2

我有maven-jaxb2-plugin以下配置:Maven的JAXB2-插件失败,JAXB版本属性必须存在

  <!-- 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:file:/home/hasancansaral/workspace/company/domain/src/main/xsd/delivery.wsdl; lineNumber:2; columnNumber:366; JAXB版本属性必须存在

如果我通过IntelliJ IDEA运行插件或执行简单的mvn clean jax2b:generate,这并没有什么不同。然而,该行动是成功的,可以发现的模式here,所以我怀疑我的wsdl模式实际上是格式不正确的,我暂时不能公开,但可以通过消息提供(我知道它并没有太大的帮助按原样公开,但如果问题出现在模式中,我会在这里发布相关的问题部分)。

注意: SOAP UI也验证架构。

注2: 同样的错误存在与两个jax2b-maven-pluginmaven-jax2b-plugin

+1

首先,我会建议使用[jaxb2-maven-plugin](http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.3.1/)...并使用最新版本.. 。如果你检查另一个模式意味着你的模式必须是罪魁祸首... – khmarbaise

+0

@khmarbaise感谢您的评论。我已经尝试了两种插件,以及它们的最新版本。我也怀疑格式不正确,并感谢您是否可以看看它。你介意我是否通过聊天向你发送模式? –

+0

@khmarbaise我可以用[SoapUI](https://www.soapui.org/)成功地使用webservice。 –

回答

5

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

问题是您的WSDL在包含的模式中包含很多JAXB自定义项。这是一个坏主意。 JAXB定制是特定于供应商的东西,任何将它们放入WSDL(应该是厂商中立规范)的人都没有做正确的事情。

现在的事情是,XJC,JAXB模式编译期望有内联JAXB自定义时的某些花里胡哨的声音。像根元素上的jaxb:version属性一样。在这种情况下,失踪。它出现在schema元素上,但不在根元素wsdl:definitions上。如果你add it,编译成功。

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

可能有一些神奇的选择来抑制这个问题,但很难弄清楚。所以我建议修补WSDL。创建一个补丁,并在预代码生成步骤中将其应用于WSDL。我个人会从WSDL中去除所有的JAXB定制,因为他们几乎忘记了那里的任何东西。

+0

非常感谢。我真的无法控制wsdl,所以我唯一能做的就是添加'xmlns:jxb =“http://java.sun.com/xml/ns/jaxb”jxb:version =“2.1”'这个解决了问题。顺便说一句,作为插件作者的支持只是向我展示了为什么我应该使用maven-jaxb2-plugin。 –