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

如何在不删除@XmlElement等注解的前提下移除Swagger生成JSON schema中的XML元素

解决方案

以下几种方案均不会修改/删除原有@XmlElement、@XmlType等JAXB注解,仅过滤Swagger生成JSON Schema时的XML元数据:

方案1:全局过滤JAXB注解解析(适用Springdoc、Swagger Core 2.x)

通过自定义注解解析器,让Swagger在生成Schema时忽略所有JAXB XML相关注解,是优先级最高的全局方案:

  • 添加自定义ModelResolver Bean到Spring上下文:
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
import io.swagger.v3.core.jackson.ModelResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.lang.annotation.Annotation;

@Configuration
public class SwaggerConfig {

    @Bean
    public ModelResolver noXmlModelResolver(ObjectMapper objectMapper) {
        AnnotationIntrospector customIntrospector = AnnotationIntrospector.pair(
                new JacksonAnnotationIntrospector(),
                new JaxbAnnotationIntrospector(objectMapper.getTypeFactory()) {
                    @Override
                    public <A extends Annotation> A findAnnotation(Annotated ann, Class<A> annotationClass) {
                        // 过滤所有JAXB XML相关注解
                        String pkg = annotationClass.getPackage().getName();
                        if (pkg.startsWith("javax.xml.bind") || pkg.startsWith("jakarta.xml.bind")) {
                            return null;
                        }
                        return super.findAnnotation(ann, annotationClass);
                    }
                }
        );
        return new ModelResolver(objectMapper.setAnnotationIntrospector(customIntrospector));
    }
}

方案2:全局移除XML字段(适用Springfox 2.x/3.x、Swagger 2/OAS3)

通过Swagger插件直接清空所有模型属性的XML配置,无需修改注解解析逻辑:

  • 新增自定义ModelProperty插件并注入Spring上下文:
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin;
import springfox.documentation.spi.schema.contexts.ModelPropertyContext;
import org.springframework.stereotype.Component;

@Component
public class RemoveXmlFieldPlugin implements ModelPropertyBuilderPlugin {

    @Override
    public void apply(ModelPropertyContext context) {
        // 直接清空属性的XML配置
        context.getBuilder().xml(null);
    }

    @Override
    public boolean supports(DocumentationType delimiter) {
        return DocumentationType.SWAGGER_2.equals(delimiter) 
                || DocumentationType.OAS_30.equals(delimiter);
    }
}

方案3:局部调整单个类/属性

如果仅需要部分类不生成XML元数据,直接在对应类/属性上添加Swagger的@Schema注解覆盖配置即可:

  • 类级别配置:@Schema(xml = @Xml)
  • 属性级别配置:@Schema(xml = null)

所有方案生效后,Swagger生成的JSON Schema中不会再包含任何XML相关节点,同时原有项目的XML序列化逻辑不受任何影响。

内容的提问来源于stack exchange,提问作者Rio85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:48:02