You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:21:42