2013-04-26 39 views
6

Tôi biết những điều cơ bản của API JAXB, nhưng tôi bị mắc kẹt với một cái gì đó tôi đang cố gắng làm, và tôi không chắc chắn cho dù đó là thực sự có thể. Cụ thể như sau:Làm thế nào để đối chiếu Java/unmarshal Java đối tượng với các lĩnh vực tư nhân sử dụng JAXB

Tôi có một lớp được gọi là Sách với 2 công biến thể hiện của kiểu String:

@XmlRootElement(name="book") 
public class Book 
{ 
    public String title; 
    public String author; 

    public Book() { 
    } 
} 

Tôi có một lớp khác gọi là thư quán với 1 công dụ biến loại ArrayList:

@XmlRootElement(name="bookshop") 
public class Bookshop 
{ 
    @XmlElementWrapper(name="book_list") 
    @XmlElement(name="book") 
    public ArrayList<Book> bookList; 

    public Bookshop() { 
     this.bookList = new ArrayList<>(); 
    } 
} 

Lưu ý: gói khai báo và nhập khẩu được loại bỏ để tiết kiệm không gian.

Hai lớp học làm việc và XML đầu ra tôi nhận được là một cái gì đó như:

<bookshop> 
    <book_list> 
     <book> 
      <title>Book 1</title> 
      <author>Author 1</author> 
     </book> 
     <book> 
      <title>Book 2</title> 
      <author>Author 2</author> 
     </book> 
    </book_list> 
</bookshop> 

Theo như tôi biết, các biến Ví dụ cần phải được công bố công theo thứ tự cho các lớp học được serialisable. Hoặc, các biến mẫu có thể được khai báo riêng, nhưng các trình truy cập và các biến thể là cần thiết trong trường hợp đó.

Tôi không thích khai báo các biến mẫu công khai; Tôi thích sử dụng accessors và mutators. Thậm chí sau đó, tôi muốn một số lĩnh vực của tôi để được chỉ đọc, tức là, không có mutator. Nhưng JAXB dường như yêu cầu cả hai accessors và mutators cho mỗi lĩnh vực bạn muốn sắp xếp/unmarshal. Tôi đã tự hỏi nếu có bất kỳ cách nào xung quanh điều này?

+2

Liệu không jaxb sử dụng phản ánh? – Jayan

+1

Nhìn vào câu hỏi này http://stackoverflow.com/questions/3391256/how-java-jaxb-works, nó chỉ hoạt động tốt với các trường riêng – Jayan

+0

Có, nó sử dụng sự phản chiếu; có lẽ tôi cần thêm thuộc tính XML vào từng trường mẫu (công khai, riêng tư hoặc được bảo vệ) – temelm

Trả lời

5

Bạn nên giữ cho các trường của bạn ở chế độ riêng tư trong mọi trường hợp. Bạn có 2 tùy chọn gắn vào lĩnh vực

1) chú thích lĩnh vực của bạn với XmlElement hay XmlAttribute chú thích

@XmlRootElement(name="book") 
public class Book { 
    @XmlElement 
    private String title; 
    ... 

2) chú thích lớp học của bạn với @XmlAccessorType (XmlAccessType.FIELD)

@XmlRootElement(name="book") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class Book { 
     private String title; 
     ... 
+0

Tôi sẽ dùng thử. – temelm

+0

Điều này thực sự làm việc cho cả marshalling và unmarshalling, điều duy nhất tôi phải làm là thêm "@XmlElement" trên đầu trang của các khai báo biến cá thể của tôi. Cảm ơn rất nhiều! – temelm

+0

@temelm - Nếu bạn chỉ định '@XmlAcessorType (XmlAccessType.FIELD)' thì bạn sẽ không cần phải đặt '@ XmlElement' trên trường. Nếu bạn chọn loại trình truy cập mặc định và chú thích trường, hãy nhớ rằng kết hợp get/set tương ứng cũng sẽ được ánh xạ theo mặc định. –

-3

JAXB sẽ cần: - Biến phiên bản công khai Hoặc - Biến cá thể riêng với biến tần công cộng và người truy cập.

Bạn sẽ cần các trình tắt cho marshalling và acessors cho unmarshalling

+0

Nó không phá vỡ nếu không có mutators nhưng các giá trị cho những lĩnh vực này trở thành 'null'. Vì vậy, mutators là phải không? – temelm

+0

Họ thực sự là như vậy. Hãy nghĩ về nó như một đối tượng và quên đi JAXB. Làm thế nào bạn sẽ sửa đổi một biến cá thể được đánh dấu riêng mà không có một mutator (hoặc lập trình hoặc bằng cách phản ánh nếu nó là JAXB người truy cập vào nó) – javadev

+0

những gì bạn nói có ý nghĩa nhưng tôi nghĩ rằng toàn bộ điểm của JAXB là để có thể làm serialization XML đơn giản/deserialization cho dù mô hình của chúng ta là gì; và như Evgeniy Dorofeev đã chỉ ra, điều này thực sự là có thể. – temelm

Các vấn đề liên quan