使用jaxb2-maven-plugin生成实现接口的类,正确命名空间是什么?
解决jaxb2-maven-plugin 3.x生成类实现自定义接口的问题
你遇到的报错是因为http://jaxb2-commons.dev.java.net/basic/inheritance是针对旧版JAXB 2.x的jaxb2-commons扩展命名空间,和你使用的基于Jakarta XML Binding 3.0的jaxb2-maven-plugin 3.1.0不兼容。下面提供两种可行的解决方案:
方案一:使用code-injector扩展注入接口实现
你之前对code-injector的理解有误,它不仅能添加自定义代码片段,还可以直接注入类的implements声明,完全满足你的需求。
修改bindings.xjb文件
替换原有命名空间,使用code-injector的命名空间并添加代码注入标签:
<?xml version="1.0" encoding="UTF-8"?> <jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:code="http://jaxb.dev.java.net/plugin/code-injector" jaxb:extensionBindingPrefixes="code" version="3.0"> <jaxb:bindings schemaLocation="application.xsd" node="/xs:schema"> <jaxb:bindings node="//xs:complexType[@name='applicationType']"> <code:code>implements com.example.SomeInterface</code:code> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
配置maven插件依赖
在jaxb2-maven-plugin的配置中添加code-injector所需的依赖,确保插件能加载该扩展:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>1.11.1</version> </dependency> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-tools</artifactId> <version>1.11.1</version> </dependency> </dependencies> </plugin>
方案二:使用兼容Jakarta的jaxb2-basics继承扩展
如果你更倾向于使用专门的inheritance:implements标签,可以引入支持Jakarta XML Binding的jaxb2-basics扩展包:
添加maven依赖
在插件的<dependencies>中添加Jakarta版本的jaxb2-basics依赖:
<dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-jakarta</artifactId> <version>1.12.0</version> </dependency>
保留原有bindings.xjb结构
此时你原来的bindings.xjb文件可以继续使用http://jaxb2-commons.dev.java.net/basic/inheritance命名空间,插件会正确识别继承扩展。
内容的提问来源于stack exchange,提问作者Petr Štechmüller
相关产品推荐
相关产品推荐

