【发布时间】: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<String, String> 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