【问题标题】:Jackson JSON Provider ignoring @JsonIgnore杰克逊 JSON 提供者忽略 @JsonIgnore
【发布时间】:2015-12-05 10:59:18
【问题描述】:

我有一个用于访问某些数据的 JAX-RS 服务。有其他类的链接,我用@JsonIgnore 注释。现在,Jackson 提供者忽略了这些注释。

我的对象:

@Entity
@Table(name = "documents")
@XmlRootElement
public class Document implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 10)
    @Column(name = "version")
    private String version;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 35)
    @Column(name = "document_number")
    private String documentNumber;
    @Basic(optional = false)
    @NotNull
    @Column(name = "document_date")
    @Temporal(TemporalType.TIMESTAMP)
    private Date documentDate;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "subDocument", fetch = FetchType.LAZY)
    private List<SubDocument> subDocumentList;

    public Document() {
    }

    public Document(Integer id) {
        this.id = id;
    }

    public Document(Integer id, String version, String documentNumber, Date documentDate) {
        this.id = id;
        this.version = version;
        this.documentNumber = documentNumber;
        this.documentDate = documentDate;
    }

    @XmlAttribute(required = false)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @XmlAttribute(required = true)
    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    @XmlAttribute(required = true)
    public String getDocumentNumber() {
        return documentNumber;
    }

    public void setDocumentNumber(String documentNumber) {
        this.documentNumber = documentNumber;
    }

    @JsonSerialize(using = JsonDateSerializer.class)
    @XmlAttribute(required = true)
    public Date getDocumentDate() {
        return documentDate;
    }

    @JsonDeserialize(using = JsonDateDeserializer.class)
    public void setDocumentDate(Date documentDate) {
        this.documentDate = documentDate;
    }

    @JsonIgnore
    public List<SubDocument> getSubDocumentList() {
        return subDocumentList;
    }

    public void setSubDocumentList(List<SubDocument> subDocumentList) {
        this.subDocumentList = subDocumentList;
    }
}

REST 应用程序配置

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new java.util.HashSet<>();
    try {
        Class jacksonProvider = Class.forName("org.codehaus.jackson.jaxrs.JacksonJsonProvider");
        resources.add(jacksonProvider);
    } catch(ClassNotFoundException ex) {
        SLOGGER.fatal("could not find class JacksonJsonProvider", ex);
    }
    addMyOtherResourceClasses(resources);
    return resources;
}

还有 REST 接口:

@GET
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
@Path("getDocumentById/{id}")
public Document getDocumentById(@PathParam("id") String id) {
    return sbDocuments.getDocumentById(id);
}

因此,即使 @JsonIgnore 注释出现在我的文档中,列表也会映射到输出。它确实适用于 @XmlTransient 注释,但由于也使用了 JAXB get,我无法添加该注释。

我使用 Codehaus 实现,但我也尝试过 FasterXML,两者结果相同。我应该怎么做才能解决这个问题?服务在 Glassfish 4.1 服务器上运行。

【问题讨论】:

  • 我猜你正在使用 Glassfish。虽然 Glassfish 有 Jackson 提供程序库,但它使用 MOXy 作为默认提供程序。所以实际上是 MOXy 正在做序列化,而不是杰克逊。如果要禁用 MOXy,请将属性 jersey.config.server.disableMoxyJson 设置为 true。您可以在 Application 子类中覆盖 Map&lt;String, String&gt; getProperties()。如果你这样做,那么如果你想支持 JAXB 注释,你将需要使用 JacksonJaxbJsonProvider 而不是 JacksonJsonProvider
  • 我已经尝试过了,但是我需要添加一个 Jackson-XC 依赖项。当我这样做时,它只会返回与以前相同的结果。同时,我在字段、getter 和 setter 上添加了@JsonIgnore。
  • 我遇到了同样的问题! (使用fastxml)。我可以将@JsonIgnore 放在成员、getter 和 setter 上——jax-rs 仍然尝试映射(并引发一个无效的 json 异常,因为成员的类型不是为 json 设计的)。有趣的是,当我将其传递给对象映射器时,相同的代码(即与 @JsonIgnore 相同的对象)工作正常。所以我认为它一定是 jax-rs 中的某些东西导致了问题。
  • @Erates 对此有何更新?

标签: java json rest jakarta-ee jackson


【解决方案1】:

将@JsonIgnore 放在字段属性之上,而不是放在getter 方法上。 即

@JsonIgnore
private List<SubDocument> subDocumentList;

【讨论】:

  • 试过了,现在我在场上有@JsonIgnore,getter 和setter。仍然输出它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 2016-01-16
  • 2014-09-30
  • 2017-09-03
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多