将服务迁移到 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 选项启用它。
为什么这个文件会出现这个异常?
您的绑定有一个简单的错误:
<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"
)。请参阅插件的迁移指南