@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已经包含了必要的依赖,你只需要做两步:
- 给你的POJO加上
@XmlRootElement注解(这会触发JSON-B对JAXB注解的识别); - 或者在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注解有原生支持,兼容性更好。只需要两步:
- 移除现有的
jersey-media-json-binding依赖; - 添加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
相关产品推荐
相关产品推荐

