如何在不删除@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
相关产品推荐
相关产品推荐

