迁移到 jaxb3/java21 后,获取元素“jxb:bindings”的前缀“jxb”未绑定异常

问题描述 投票:0回答:1

将服务迁移到 java21 和 jaxb3.0 时,从 wsdl 生成 xjb 文件的类会给出 'org.xml.sax.SAXParseException; XXX 元素“jxb:绑定”的前缀“jxb”未绑定。 不确定问题是文件本身还是插件的配置方式。

maven构建的最终错误是: [错误] 无法在项目 project-api 上执行目标 org.jvnet.jaxb:jaxb-maven-plugin:4.0.0:generate (WSDL):无法解析输入模式。应该提供错误消息。 -> [帮助1]

异常原因是插件生成的类。 主要异常: [错误] 解析架构时出错。位置 [ file:/C:/project/project-api/src/main/resources/bindings/wsBinding.xjb{8,52}]。 org.xml.sax.SAXParseException:元素“jxb:绑定”的前缀“jxb”未绑定。 ...(长堆栈跟踪)

发生异常后: org.xml.sax.SAXParseException;系统ID:文件:/C:/project/project-api/src/main/resources/bindings/wsBinding.xjb;行号:8;列数:52;元素“jxb:bindings”的前缀“jxb”未绑定。 ...(更多堆栈跟踪)

以下是有问题的绑定:

原始绑定(jaxb2、java8):

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="1.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
              xmlns:annox="http://annox.dev.java.net"
              jxb:extensionBindingPrefixes="annox">

<jxb:globalBindings>
    <xjc:serializable uid="7702"/>
    <xjc:javaType adapter="com.cie.project.adapter.LocalDateAdapter" name="java.time.LocalDate"
                  xmlType="xsd:date"/>
</jxb:globalBindings>

   <jxb:bindings schemaLocation="../clients/wsBinding.wsdl" node="/wsdl:definitions/wsdl:types/xsd:schema">
    <jxb:bindings node="//xsd:complexType[@name='theRequest']">
        <jxb:class name="TheRequestType"/>
        <annox:annotateClass>@javax.xml.bind.annotation.XmlRootElement(name="theRequest")</annox:annotateClass>
      </jxb:bindings>

      <jxb:bindings node="//xsd:complexType[@name='theResponse']">
        <jxb:class name="TheResponseType"/>
        <annox:annotateClass>@javax.xml.bind.annotation.XmlRootElement(name="theResponse")</annox:annotateClass>
      </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

新更新的绑定出现错误(java21,jaxb3)

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="1.0"
              xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
              xmlns:annox="http://annox.dev.java.net"
              jxb:extensionBindingPrefixes="annox">

    <jxb:globalBindings>
        <xjc:serializable uid="7702"/>
        <xjc:javaType adapter="com.cie.project.adapter.LocalDateAdapter" name="java.time.LocalDate"
                      xmlType="xsd:date"/>
    </jxb:globalBindings>

    <jxb:bindings schemaLocation="../clients/wsBinding.wsdl" node="/wsdl:definitions/wsdl:types/xsd:schema">
        <jxb:bindings node="//xsd:complexType[@name='theRequest']">
            <jxb:class name="TheRequestType"/>
            <annox:annotateClass>@jakarta.xml.bind.annotation.XmlRootElement(name="theRequest")</annox:annotateClass>
        </jxb:bindings>

        <jxb:bindings node="//xsd:complexType[@name='theResponse']">
            <jxb:class name="TheResponseType"/>
            <annox:annotateClass>@jakarta.xml.bind.annotation.XmlRootElement(name="theResponse")</annox:annotateClass>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

这里是 Maven 中的 jaxbplugin 配置,如果有帮助的话

  <plugin>
      <groupId>org.jvnet.jaxb</groupId>
      <artifactId>jaxb-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>WSDL</id>
        <goals>
          <goal>generate</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <schemaLanguage>WSDL</schemaLanguage>
      <generatePackage>com.cie.project.ws</generatePackage>
      <schemaDirectory>${project.basedir}</schemaDirectory>
      <schemaIncludes>
        <include>src/main/resources/clients/*.wsdl</include>
      </schemaIncludes>
      <bindingDirectory>${project.basedir}</bindingDirectory>
      <bindingIncludes>
        <include>src/main/resources/bindings/*.xjb</include>
      </bindingIncludes>
      <verbose>true</verbose>
      <plugins>
        <plugin>
            <groupId>org.jvnet.jaxb</groupId>
            <artifactId>jaxb-plugins</artifactId>
        </plugin>
      </plugins>
    </configuration>
  </plugin>

请注意,确定这是否相关,在这些异常之前我收到了一个奇怪的警告: org.xml.sax.SAXParseException:您是否正在尝试编译 WSDL ? 对 WSDL 的支持是实验性的。您可以使用 -wsdl 选项启用它。

为什么这个文件会出现这个异常?

java jaxb wsdl xjc
1个回答
0
投票

您的绑定有一个简单的错误:

<jxb:bindings version="1.0"
              xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
              xmlns:annox="http://annox.dev.java.net"
              jxb:extensionBindingPrefixes="annox">

您获得了

jxb:bindings
声明,但
xmlns:jAxb
作为声明的命名空间。

如果您仍想使用 jxb,请将

xmlns:jaxb
替换为
xmlns:jxb
命名空间前缀。

您还可以将

xmlns:annox="http://annox.dev.java.net"
替换为新的 annox 命名空间
urn:jaxb.jvnet.org:annox
(因此使用
xmlns:annox="urn:jaxb.jvnet.org:annox"
)。请参阅插件的迁移指南

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.