Java Jackson JSON提供程序忽略@JsonIgnore
我有一个JAX-RS服务来访问一些数据。还有指向其他类的链接,我用Java Jackson JSON提供程序忽略@JsonIgnore,java,json,rest,jakarta-ee,jackson,Java,Json,Rest,Jakarta Ee,Jackson,我有一个JAX-RS服务来访问一些数据。还有指向其他类的链接,我用@JsonIgnore注释了这些类。现在,Jackson提供者忽略了这些注释 我的目标: @Entity @Table(name = "documents") @XmlRootElement public class Document implements Serializable { private static final long serialVersionUID = 1L; @Id @Genera
@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;
}
}
因此,即使我的文档中存在@JsonIgnore
注释,列表也会映射到输出。它确实适用于@xmltransive
注释,但由于也使用了jaxbget,因此我无法添加该注释
我使用Codehaus实现,但我也尝试了FasterXML,两者的结果相同。我该怎么做才能解决这个问题?服务正在Glassfish 4.1服务器上运行。将@JsonIgnore放在字段属性上方,而不是放在getter方法上。 i、 e
@JsonIgnore
私有列表子文档列表;
我猜你用的是玻璃鱼。尽管Glassfish有Jackson提供程序库,但它使用MOXy作为默认提供程序。所以实际上是莫西在做连载,而不是杰克逊。如果要禁用MOXy,请将属性jersey.config.server.disableMoxyJson
设置为true。您可以覆盖应用程序
子类中的Map getProperties()
。如果您这样做,那么您将需要使用JacksonJaxbJsonProvider
,而不是JacksonJsonProvider
,如果您想要支持JAXB注释,我已经尝试过了,但是我需要添加jacksonxc依赖项。当我这样做时,它只返回与以前相同的结果。同时,我在球场上添加了@JsonIgnore,getter和setter。我遇到了同样的问题!(使用fasterxml)。我可以将@JsonIgnore放在成员处,getter和setter-jax-rs仍然尝试映射(并引发无效的json异常,因为成员的类型不是为json设计的)。有趣的是,当我将相同的代码(即带有@JsonIgnore的相同对象)传递给对象映射器时,它可以很好地工作。因此,我假设一定是jax rs中的某些东西造成了问题。@对此有什么更新吗?尝试过了,现在我在字段中有了@JsonIgnore,getter和setter。仍然输出它。
@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;
}
@GET
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
@Path("getDocumentById/{id}")
public Document getDocumentById(@PathParam("id") String id) {
return sbDocuments.getDocumentById(id);
}
@JsonIgnore
private List<SubDocument> subDocumentList;