基于Schema为JAXB绑定类生成Jackson属性的自定义绑定方案
让JAXB生成的类支持Jackson JSON多态绑定的解决方案
我来帮你搞定这个需求——要让JAXB生成的Java类同时支持Jackson的JSON多态处理,通过XJB(JAXB绑定文件)自定义添加@JsonTypeInfo注解是完全可行的,下面是具体的实现步骤和示例:
1. 准备必要的依赖
首先要确保你的构建工具(比如Maven)能支持通过XJB添加自定义注解,需要引入jaxb2-basics-annotate(annox扩展)和Jackson注解依赖:
如果用Maven,在pom.xml中添加插件和依赖:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <dependencies> <!-- Annox扩展:允许在XJB中添加自定义Java注解 --> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-annotate</artifactId> <version>1.11.1</version> </dependency> <!-- Jackson注解依赖:生成的类需要这个来识别JSON多态配置 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.15.2</version> </dependency> </dependencies> <configuration> <bindingDirectory>${project.basedir}/src/main/resources</bindingDirectory> <schemaDirectory>${project.basedir}/src/main/resources</schemaDirectory> <extension>true</extension> <!-- 必须启用扩展才能使用annox --> </configuration> </plugin>
2. 完善你的XJB绑定文件
接下来补全你的XJB文件,添加annox命名空间,并针对需要的类添加@JsonTypeInfo(以及可选的@JsonSubTypes)注解:
<?xml version="1.0" encoding="UTF-8"?> <jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="xjc annox"> <!-- 声明启用annox扩展 --> <!-- 绑定到你的目标XSD文件 --> <jaxb:bindings schemaLocation="your-target-schema.xsd"> <!-- 针对需要添加JSON多态注解的基类(比如名为BaseType的复杂类型) --> <jaxb:bindings node="//xs:complexType[@name='BaseType']"> <annox:annotate target="class"> <!-- 添加@JsonTypeInfo:配置JSON多态识别规则 --> <annox:annotation class="com.fasterxml.jackson.annotation.JsonTypeInfo"> <annox:member name="use" value="NAME"/> <!-- 用类型名称识别子类 --> <annox:member name="include" value="AS_PROPERTY"/> <!-- 把类型信息作为JSON属性 --> <annox:member name="property" value="type"/> <!-- 类型属性的名称为"type" --> </annox:annotation> <!-- 可选:如果基类有子类,添加@JsonSubTypes映射类型名和子类 --> <annox:annotation class="com.fasterxml.jackson.annotation.JsonSubTypes"> <annox:member name="value"> <annox:annotation class="com.fasterxml.jackson.annotation.JsonSubTypes.Type"> <annox:member name="name" value="sub-type-1"/> <annox:member name="value" value="com.your.package.SubType1"/> </annox:annotation> <annox:annotation class="com.fasterxml.jackson.annotation.JsonSubTypes.Type"> <annox:member name="name" value="sub-type-2"/> <annox:member name="value" value="com.your.package.SubType2"/> </annox:annotation> </annox:member> </annox:annotation> </annox:annotate> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
3. 关键配置说明
jaxb:extensionBindingPrefixes:必须包含annox,否则JAXB无法识别annox的注解扩展。@JsonTypeInfo参数:use=NAME:通过类型名称区分子类,你也可以换成CLASS(用全类名)或其他枚举值。include=AS_PROPERTY:将类型信息作为JSON对象的一个属性输出,也可以选择WRAPPER_OBJECT(用包装对象)等方式。property="type":指定存储类型信息的JSON属性名,可自定义。
@JsonSubTypes:如果基类有多个子类,必须配置这个注解来映射类型名称和对应的Java类,否则Jackson无法正确反序列化JSON到具体子类。
4. 生成代码
运行构建命令(比如Maven的mvn clean install),JAXB会自动生成带有Jackson多态注解的Java类,这些类既可以用JAXB处理XML序列化/反序列化,也可以用Jackson处理JSON的多态场景。
内容的提问来源于stack exchange,提问作者Kishor Prakash
相关产品推荐
相关产品推荐

