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 でリストのゲッターに注釈を付けたり、他の場所で他の注釈を使用したりするなど、インターネットで見つけた多くのアイデアを試しましたが (今は覚えていません)、何も機能しませんでした。

編集:これは応答がどのように見えるかです:

<book isbn="3333333333">
    <title>Mere Christianity</title>
    <authors>C. S. Lewis</authors>
    <year>2000</year>
</book>

予約も表示したいです。

解決策は何ですか?ありがとう!ソリン

4

5 に答える 5

3

I think the problem may be with the list bookReservations being 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;
    }
}

I use this code everyday and works for me (Ignore other annotations that I have not provided).

I have faced problem in these cases but only found that due to the list being null for some reason it is not serialized. Try checking whether the list is being set by JAXB in the setter method by debugging at that method.

于 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

解決しました!しかし、問題はシリアル化ではなく、EntityManagerによって呼び出されたメソッドfind()が予約を抽出してブックオブジェクトに入れることができなかったため、リストは空のままで、対応する要素は表示されませんでした。したがって、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
    }

また、@ XmlAccessorType(XmlAccessType.FIELD)をBookクラスから削除し、リストのゲッターに@XmlElementWrapper(name = "reservations")および@XmlElement(name = "reservation")という注釈を付ける必要があります。

于 2012-11-29T11:09:17.677 に答える
0

でラップする@XmlRootelementnillable="true"、空<reservations>になります。

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

@XmlAccessorType.PROPERTYの代わりに使用しFIELDます。JPA impl は、予約のリストを遅延ロードする場合があります。このアクションは、プロパティ (get メソッド) にアクセスすることによってトリガーされます。

詳細については

于 2012-11-29T10:20:51.170 に答える