3

我有课本:

@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>

但我也想表明保留意见。

解决方案似乎是什么?谢谢!索林

4

5 回答 5

3

我认为问题可能出在列表bookReservationsnull

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;
    }
}

我每天都使用此代码并为我工作(忽略我未提供的其他注释)。

在这些情况下我遇到了问题,但只发现由于某种原因列表为空,它没有被序列化。尝试通过在 setter 方法中调试来检查列表是否由 JAXB 设置。

于 2012-11-29T10:18:01.463 回答
1

我的野客人是延迟加载的问题,您可以在 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

        ...........
 }
于 2012-11-29T10:33:52.087 回答
0

使用@XmlAccessorType.PROPERTY而不是FIELD. JPA impl 可能会延迟加载预订列表,此操作将通过访问属性(get 方法)触发。

了解更多信息

于 2012-11-29T10:20:51.170 回答
0

解决了!但问题不在于序列化,而是 EntityManager 调用的方法 find() 无法提取预订并将其放入我的 book 对象中,因此列表仍然为空,并且其对应的元素未显示。因此,似乎应该使用 Query,而不是使用 find():

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
    }

此外,@XmlAccessorType(XmlAccessType.FIELD) 必须从 Book 类中删除,并且列表的 getter 应使用 @XmlElementWrapper(name = "reservations") 和 @XmlElement(name = "reservation") 进行注释。

于 2012-11-29T11:09:17.677 回答
0

@XmlRootelement用with包裹,然后会有nillable="true"一个空的。<reservations>

@XmlElement
@XmlElementWrapper(nillable=true)
private List<Reservation> bookReservations;
于 2012-11-29T12:29:25.863 回答