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

@XmlTransient在JSON输出中失效问题求助(基于Jersey JAX-RS)

解决Jersey中@XmlTransient在JSON输出不生效的问题

这个问题我之前也碰到过,本质是注解规范不兼容导致的:@XmlTransient是JAXB(XML绑定)的专属注解,而你用的jersey-media-json-binding依赖基于JSON-B规范(默认用Yasson实现),JSON-B默认不会自动识别JAXB的注解,所以XML输出能正确忽略字段,但JSON里还是会显示被标记的POJO。

下面给你几个实用的解决方案,按需选择:

方案1:同时用两种注解(最省心)

直接在需要忽略的字段/方法上同时加@XmlTransient和@JsonbTransient,这样XML和JSON输出都会正确跳过该字段。举个例子:

public class ParentEntity {
    // 这个字段在XML和JSON里都会被隐藏
    @XmlTransient
    @JsonbTransient
    private ChildEntity child;
    
    // 其他字段、getter/setter...
}

这个方法零配置,不需要加额外依赖,上手最快。

方案2:让JSON-B支持JAXB注解

如果你不想多加注解,可以配置Yasson(JSON-B的默认实现)来识别JAXB注解。最新版的Jersey里,jersey-media-json-binding已经包含了必要的依赖,你只需要做两步:

  1. 给你的POJO加上@XmlRootElement注解(这会触发JSON-B对JAXB注解的识别);
  2. 或者在Jersey的应用配置里显式启用JAXB注解支持:
@ApplicationPath("/api")
public class MyApiApplication extends ResourceConfig {
    public MyApiApplication() {
        // 注册自定义JSON-B配置
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                JsonbConfig jsonbConfig = new JsonbConfig()
                        .withProperty(JsonbProperties.JAXB_ANNOTATIONS_SUPPORT, true);
                bind(jsonbConfig).to(JsonbConfig.class);
            }
        });
        // 注册你的资源类
        packages("com.your.package.resources");
    }
}

这样配置后,@XmlTransient就能同时作用于XML和JSON输出了。

方案3:换用Jackson作为JSON提供者

如果上面的方案都不合心意,你可以把JSON-B换成Jackson——Jackson对JAXB注解有原生支持,兼容性更好。只需要两步:

  1. 移除现有的jersey-media-json-binding依赖;
  2. 添加Jackson的Jersey支持依赖:
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
</dependency>

替换完成后,@XmlTransient会自动在XML和JSON输出中生效,不需要额外配置。

总结一下:方案1最直接,方案2适合想只用JAXB注解的场景,方案3适合长期依赖Jackson的项目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:42:06