[英]Serialize a java.util.list in JAX-RS
我有课本:
@Entity
@Table(name = "books")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class Book {
@Id
@XmlAttribute
private String isbn;
private String title;
private String authors;
private int year;
@OneToMany(mappedBy="reservedBook")
private List<Reservation> bookReservations;
//Getters, setters, addReservation, remove Reservation
......................
}
然后,我有班级预约
@Entity
@Table(name = "reservations")
@XmlRootElement
public class Reservation {
private String username;
private String isbn;
@Temporal(TemporalType.DATE)
private Date date;
@ManyToOne
@JoinColumn(name = "isbn")
private Book reservedBook;
@ManyToOne
@JoinColumn(name = "username")
private User userWhoReserved;
//Getters and setters
...........
}
在资源类中,我尝试获取这样的特定书:
@GET
@Path("/{isbn}")
@Produces(MediaType.TEXT_XML)
public Book getBookByIsbn(@PathParam("isbn") String isbn) {
Book book = entityManager.find(Book.class, isbn);
if (book != null) {
return book;
}
}
现在,它没有序列化字段List bookReservations。 我已经尝试了很多在互联网上发现的想法,比如用@XmlElement注释列表的getter或者在其他地方使用其他注释(我现在不记得了),但没有任何效果。
编辑:这是响应的样子:
<book isbn="3333333333">
<title>Mere Christianity</title>
<authors>C. S. Lewis</authors>
<year>2000</year>
</book>
但我也想表明保留意见。
什么似乎是解决方案? 谢谢! 索林
我认为问题可能是列表bookReservations
为null
。
class A{
private List<String> someList = new ArrayList<String>();
@XmlElement(name = "some-tag")
public List<String> getList() {
return someList;
}
public void setSomeList(List<String> someOtherList) {
this.someList = someOtherList;
}
}
我每天都使用这个代码并为我工作(忽略我没有提供的其他注释)。
我在这些情况下遇到了问题,但只发现由于某些原因列表为空而没有序列化。 尝试通过调试该方法检查JAXB是否在setter方法中设置列表。
我的狂野客人是延迟加载的问题,你可以在OneToMany和ManyToOne注释中添加fetch = FetchType.EAGER。
public class Book {
@Id
@XmlAttribute
private String isbn;
private String title;
private String authors;
private int year;
@OneToMany(mappedBy="reservedBook",fetch = FetchType.EAGER)
private List<Reservation> bookReservations;
//Getters, setters, addReservation, remove Reservation
......................
}
在预订课程中:
public class Reservation {
private String username;
private String isbn;
@Temporal(TemporalType.DATE)
private Date date;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "isbn")
private Book reservedBook;
@ManyToOne
@JoinColumn(name = "username")
private User userWhoReserved;
//Getters and setters
...........
}
使用@XmlAccessorType.PROPERTY
而不是FIELD
。 JPA impl可能是延迟加载预留列表,此操作将通过访问属性(get方法)触发。
欲获得更多信息
解决了! 但问题不在于序列化,而是由EntityManager调用的方法find()无法提取保留并将它们放入我的book对象这一事实,因此列表保持为空并且未显示相应的元素。 所以,而不是使用find(),似乎应该使用Query:
Query query = entityManager.createQuery("SELECT book FROM Book book WHERE book.isbn = :_isbn ");
query.setParameter("_isbn", isbn);
//if getSingleResult() doesn't find a book, an exception will be thrown
try {
Book book = (Book)query.getSingleResult();
return book;
}
catch(RuntimeException e)
{
//do something
}
此外,必须从Book类中删除@XmlAccessorType(XmlAccessType.FIELD),并且应使用@XmlElementWrapper(name =“reservations”)和@XmlElement(name =“reservation”)注释列表的getter。
使用带有nillable="true"
的@XmlRootelement
换行,然后将出现一个空的<reservations>
。
@XmlElement
@XmlElementWrapper(nillable=true)
private List<Reservation> bookReservations;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.