【问题标题】:Jackson serializes a private field with field autodection offJackson 序列化一个私有字段,并关闭字段自动检测
【发布时间】:2015-07-23 08:13:36
【问题描述】:

我使用的是 resteasy 3.0.11 版,使用 jaxb 和 jackson 2.0 作为序列化提供程序。我有一个看起来像这样的服务:

@Path("/path")
@IgnoreMediaTypes("application/*+json")
public interface MyService {
    @GET
    @Path("/test")
    @Produces(MediaType.APPLICATION_JSON)
    @IgnoreMediaTypes("application/*+json")
    MyData getData();
}

这是 MyData 类:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class MyData implements JsonSerializable {
    @JsonProperty
    private int a;
    private int b;
}

JsonSerializable 接口:

@JsonAutoDetect(
  fieldVisibility = JsonAutoDetect.Visibility.NONE, 
  getterVisibility = JsonAutoDetect.Visibility.NONE, 
  setterVisibility = JsonAutoDetect.Visibility.NONE, 
  isGetterVisibility = JsonAutoDetect.Visibility.NONE, 
  creatorVisibility = JsonAutoDetect.Visibility.NONE)
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown=true)
public interface JsonSerializable {}

我的问题是当我用localhost/path/test调用这个服务时,MyData类的b属性也被序列化了:

{"a":0,"b":0}

甚至,JsonSerializeble 接口的 fieldVisibility 设置为 NONE。已经尝试了我所能做的一切,但没有成功。对这个问题有帮助吗?

【问题讨论】:

  • 您的字段不是标题所说的私有字段,它具有默认访问修饰符
  • @Panther,抱歉,我错过了修饰符...更新了帖子。

标签: java serialization jackson resteasy


【解决方案1】:

我怀疑,JAXB 注释优先于 Jackson 注释。这取决于 Jackson 的配置方式(有关详细信息,请参阅documentation)。

@XmlAccessorType(XmlAccessType.FIELD)@JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY)基本相同。删除 @XmlAccessorType 注释,你应该很高兴。

【讨论】:

  • 我知道删除 XmlAccesorType 会有效...但根据文档,这不应该发生,因为我使用了 IgnoreMediaTypes
  • 根据我在文档@IgnoreMediaTypes 中读到的内容,RESTEasy 无法使用自己的 JAXB 提供程序。但是,如果 Jackson 是替代提供者并且它也被配置为处理 JAXB 注释,那么我的回答仍然有效。但是,这显然不是您要寻找的答案。
  • 我认为最后的评论是我问题的答案,所以我会接受它。您能否提供我应该如何配置 Jackson 以优先于 json 注释?我没有启用任何 jaxb 支持。
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2016-02-12
  • 2012-05-01
  • 2011-07-30
  • 1970-01-01
  • 2018-11-17
相关资源
最近更新 更多