在读取具有一对多关系的JPA模型时生成不完整的JSON错误

问题描述 投票:2回答:3

我正在使用JPA EclipseLink来模拟UseCase和PainPoint之间的一对多关系。我能够很好地插入值。此后,我使用JAX-RS使用GET方法检索数据。 GET方法失败并显示错误 - 生成不完整的JSON。

控制台日志:

  • [EL精细]:INSERT INTO USECASE(UseCaseID,Description)VALUES(?,?)bind => [1,描述]
  • [EL精细]:INSERT INTO PAIN_POINT(PainPointID,PainPointDescription,USECASE_ID)VALUES(?,?,?)bind => [2,痛点1,1]
  • [EL精细]:SELECT用例,描述FROM USE CASE
  • 2017年11月17日下午7:16:22 org.eclipse.yasson.internal.Marshaller marshall严重:生成不完整的JSON

用例:

@NamedQueries({@NamedQuery(name = "getAllUseCases", query = "SELECT c FROM UseCase c")})

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@NotNull
@Column(name = "UseCaseID")
private int UseCaseID;

@Column(name = "Description")
private String Description;

@OneToMany(mappedBy="usecase", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
private Collection<PainPoint> painPoints = new ArrayList<PainPoint>();

痛点:

@NamedQueries({@NamedQuery(name = "getAllPainPoints", query = "SELECT c FROM PainPoint c")})

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@NotNull
@Column(name = "PainPointID")
private int PainPointID;

@Column(name = "PainPointDescription")
private String PainPointDescription;

@ManyToOne
@JoinColumn (name="USECASE_ID", referencedColumnName="UseCaseID")
private UseCase usecase;

的DataLoader:

UseCase useCase = new UseCase("Description 1");
PainPoint painPoint1 = new PainPoint("Pain Point 1", useCase);
useCase.getPainPoints().add(painPoint1);
em.persist(useCase);

UseCaseService:

@GET
@Path("/")
public List<UseCase> getUseCases() {

List<UseCase> retVal = null;

EntityManagerFactory emf = Utility.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();

retVal = em.createNamedQuery("getAllUseCases").getResultList();

return retVal;
}
json jackson jax-rs eclipselink one-to-many
3个回答
5
投票

在循环引用的getter方法或任何其他派生字段上添加注释@JsonbTransient(package:javax.json.bind.annotation.JsonbTransient)。这相当于XML生成的@XmlTranisent注释,并将阻止转换为JSON进入无限循环。

取决于你的工具集,我想,但对于我使用NetBeans,当自动生成实体类时,会添加XML的注释,但不会添加JSON。只需将每个@XmlTransient与等效的@JsonbTransient匹配即可


2
投票

根据Dale上面说的。您可以添加以下Maven依赖项

<dependency>
    <groupId>javax.json.bind</groupId>
    <artifactId>javax.json.bind-api</artifactId>
    <version>1.0</version>
</dependency>

有关@JsonbTransient的更多信息可以在link中找到


0
投票

这很可能是由循环引用引起的,有两种处理这个问题的方法,如Json and Java - Circular Reference所述:

  1. @JsonIgnore
  2. @JsonManagedReference和@JsonBackReference

我建议你采取第二种方法并添加这两个注释两个避免循环引用问题:

@OneToMany(mappedBy="usecase", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JsonBackReference                ///// ADD THIS ANNOTATION
private Collection<PainPoint> painPoints = new ArrayList<PainPoint>();


@ManyToOne
@JoinColumn (name="USECASE_ID", referencedColumnName="UseCaseID")
@JsonManagedReference              ///// ADD THIS ANNOTATION
private UseCase usecase;

更多信息:

© www.soinside.com 2019 - 2024. All rights reserved.