具有一对一关系的实体的 JSON 输出

use*_*530 2 java eclipse json jpa jakarta-ee

我尝试输出我的实体飞行,它与我的其他实体飞机具有 OneToOne 关系,但我得到空结果并且 Eclipse 开始在 gson 中抛出异常。同样在我将此关系添加到 Flight 类之前,我的 JSON 输出没有问题。任何想法我必须改变以使其正常工作。

我的飞行课:

@Entity
@NamedQueries({ @NamedQuery(name = "Flight.getAll", query = "SELECT f FROM Flight f"), })
@NamedQuery(name = "Flight.getByDestination", query = "SELECT f FROM Flight f WHERE f.destinationFrom=:destinationFrom AND f.destinationTo=:destinationTo")
public class Flight implements Serializable {

@Transient
private static final long serialVersionUID = 1L;

public Flight() {
    super();
}

public Flight(FlightDestination destinationFrom, FlightDestination destinationTo, Integer flightPrice, Date date,
        Airplane airplaneDetail) {
    super();
    this.destinationFrom = destinationFrom;
    this.destinationTo = destinationTo;
    this.flightPrice = flightPrice;
    this.date = date;
    this.airplaneDetail = airplaneDetail;
}

public Flight(FlightDestination destinationFrom, FlightDestination destinationTo, Integer flightPrice, Date date) {
    super();
    this.destinationFrom = destinationFrom;
    this.destinationTo = destinationTo;
    this.flightPrice = flightPrice;
    this.date = date;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Enumerated(EnumType.STRING)
private FlightDestination destinationFrom;

@Enumerated(EnumType.STRING)
private FlightDestination destinationTo;

private Integer flightPrice;

@Temporal(TemporalType.DATE)
private Date date;

@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE })
@JoinColumn(name = "airplane_fk")
private Airplane airplaneDetail;

@Override
public String toString() {
    return "Flight [id=" + id + ", destinationFrom=" + destinationFrom + ", destinationTo=" + destinationTo
            + ", flightPrice=" + flightPrice + ", date=" + date + ", airplaneDetail=" + airplaneDetail + "]";
}}
Run Code Online (Sandbox Code Playgroud)

飞机实体:

@Entity

public class Airplane implements Serializable {

private static final long serialVersionUID = 1L;

public Airplane() {
    super();
}

public Airplane(String planeModel, Integer seatingCapacity) {
    super();
    this.planeModel = planeModel;
    this.seatingCapacity = seatingCapacity;
}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String planeModel;

private Integer seatingCapacity;

@OneToOne(mappedBy = "airplaneDetail")
private Flight flight;

@Override
public String toString() {
    return "Airplane [id=" + id + ", planeModel=" + planeModel + ", seatingCapacity=" + seatingCapacity
            + ", flight=" + flight + "]";
}}
Run Code Online (Sandbox Code Playgroud)

我的网络服务:

@Path("/flights")
public class FlightsWebService {

@PersistenceContext(unitName = "airline")
private EntityManager em;

@EJB
private FlightService fs;

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Flight> getFlights() {

    List<Flight> fList = fs.getAllFlights();
    return fList;

}}
Run Code Online (Sandbox Code Playgroud)

但我得到的结果是这样的,当我添加 OneToOne 关系时:

[{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":{"airplaneDetail":{"flight":
Run Code Online (Sandbox Code Playgroud)

这是例外:

Caused by: com.owlike.genson.TransformationException: Could not serialize property 'flight' from class com.airline.models.Airplane
at com.owlike.genson.reflect.PropertyAccessor.couldNotSerialize(PropertyAccessor.java:48)
at com.owlike.genson.reflect.PropertyAccessor.serialize(PropertyAccessor.java:31)
at com.owlike.genson.reflect.BeanDescriptor.serialize(BeanDescriptor.java:87)
at com.owlike.genson.convert.BeanViewConverter.serialize(BeanViewConverter.java:92)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.serialize(NullConverter.java:51)
at com.owlike.genson.reflect.PropertyAccessor.serialize(PropertyAccessor.java:29)
at com.owlike.genson.reflect.BeanDescriptor.serialize(BeanDescriptor.java:87)
at com.owlike.genson.convert.BeanViewConverter.serialize(BeanViewConverter.java:92)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.serialize(NullConverter.java:51)
at com.owlike.genson.convert.CircularClassReferenceConverterFactory$CircularConverter.serialize(CircularClassReferenceConverterFactory.java:30)
at com.owlike.genson.reflect.PropertyAccessor.serialize(PropertyAccessor.java:29)
at com.owlike.genson.reflect.BeanDescriptor.serialize(BeanDescriptor.java:87)
at com.owlike.genson.convert.BeanViewConverter.serialize(BeanViewConverter.java:92)
at com.owlike.genson.convert.NullConverter$NullConverterWrapper.serialize(NullConverter.java:51)
at com.owlike.genson.reflect.PropertyAccessor.serialize(PropertyAccessor.java:29)
at com.owlike.genson.reflect.BeanDescriptor.serialize(BeanDescriptor.java:87)
at com.owlike.genson.convert.BeanViewConverter.serialize(BeanViewConverter.java:92)
Run Code Online (Sandbox Code Playgroud)

Maa*_*els 5

问题是循环依赖Flight -> Airplane -> Flight -> Airplane -> ...。序列化器进入无限循环。您可以在生成的输出中识别出这一点。

一种解决方案是忽略关系的一侧,请参阅此处了解执行此操作的选项。一种方法是使用注释。

@Entity

public class Airplane implements Serializable {
...
    @JsonIgnore
    @OneToOne(mappedBy = "airplaneDetail")
    private Flight flight;
...
}
Run Code Online (Sandbox Code Playgroud)

这将生成带有飞机的航班列表,但将忽略对航班的反向引用。

[
  {
    "airplaneDetail":
      {
        "planeModel":"...",
        "seatingCapacity":"..."
//  NO  "flight":{...}
      },
    "destinationFrom":{},
    "destinationTo":{},
    ...
  },
]
Run Code Online (Sandbox Code Playgroud)