2012-11-08 37 views
14

Tôi gặp sự cố khi sử dụng JaxB trong Netbeans 7.1.2.Java JaxB - Đối tượng với chuỗi XML đến đối tượng

Tôi đã tự động tạo các lớp của mình từ một lược đồ bằng cách sử dụng JaxB (New JaxB Binding). Tôi đang tạo đối tượng sẽ được tuần tự hóa thành một chuỗi XML bằng cách sử dụng Marshaller và sau đó quay trở lại một cá thể đối tượng mới từ chuỗi XML. Tuy nhiên, tôi nhận được ngoại lệ sau:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none) 

Việc sắp xếp/tuần tự hóa thành chuỗi XML hoạt động tốt. Đó là khi nó được unmarshalled/deserialized đó là gây ra vấn đề.

Tôi đang sử dụng đoạn mã sau để xây dựng các đối tượng và sắp xếp nó thành một chuỗi XML:

// build the object 
ObjectFactory of = new ObjectFactory(); 

MyQueryComplexType oaaqc = of.createMyQueryComplexType(); 
oaaqc.setField1("edit"); 
oaaqc.setField2("net"); 
oaaqc.setField3("24"); 

JAXBElement<MyQueryComplexType> createMyQueryComplexType = of.createMyQueryComplexTypeQuery(oaaqc); 

// serialise to xml 
StringWriter writer = new StringWriter(); 
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);    
Marshaller m = context.createMarshaller(); 
m.marshal(createMyQueryComplexType, writer); 

// output string to console 
String theXML = writer.toString(); 
System.out.println(theXML); 

này tạo ra XML sau đây (định dạng) trong giao diện điều khiển:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<MyQueryComplexTypeQuery xmlns="http://www.somewhere.com/some/path"> 
    <Field1>edit</Field1> 
    <Field2>net</Field2> 
    <Field3>24</Field3> 
</MyQueryComplexTypeQuery> 

Bây giờ tôi đến để deserialize/unmarshal chuỗi để một trường hợp mới MyQueryComplexType với mã sau đây:

Unmarshaller u = context.createUnmarshaller(); 
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML)); 

Trong tự động tạo package-info.java nó có các nội dung sau:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package MyProject.SomeNamespace.MyQuery; 

tôi nghĩ quá trình đơn giản của đối tượng -> chuỗi -> đối tượng sẽ làm việc. Đây là lần đầu tiên tôi sử dụng JaxB (thật nhẹ nhàng). Tôi đã thấy các bài viết khác đề cập đến các không gian tên, và mọi thứ đều ổn với tôi. Tôi đã tự động tạo ra các lớp từ lược đồ, xây dựng đối tượng, được sắp xếp thành chuỗi xml. Tôi nghĩ rằng chỉ đơn giản là đảo ngược quá trình cho unmarshal sẽ là tương tự.

Ngoại lệ thực tế được ném trên đường dây:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML)); 

Tôi nghĩ rằng tôi đã làm unmarshalling từ chuỗi phản đối sẽ được đơn giản. Tôi không biết mình đang làm gì sai hay thiếu cái gì đó. Tôi hy vọng các bạn có thể làm sáng tỏ hoặc mở mắt.

Tôi đã cắt giảm mã để đơn giản hóa những gì trong ứng dụng của tôi gây ra lỗi. Không gian tên đã được thay đổi để bảo vệ danh tính của mọi thứ trên web.

Mọi suy nghĩ?

Cảm ơn

Andez

Trả lời

17

Tạo JAXBContext

Đối với mô hình JAXB được tạo ra từ một lược đồ XML, bạn có thể tạo ra các JAXBContext vào tên gói chứ không phải trên một lớp học đặc biệt:

JAXBContext context = JAXBContext.newInstance("your.package.name"); 

Không:

JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class); 

này sẽ đảm bảo rằng lớp ObjectFactory chứa @XmlElementDecl chú thích được xử lý một cách chính xác được những gì là mất tích từ trường hợp sử dụng của bạn.

unmarshal Operation

Lưu ý rằng trong quá trình hoạt soái của bạn, bạn cần phải quấn bạn thể hiện của MyQueryComplexType trong một JAXBElement? Điều này là do MyQueryComplexType không được chú thích với @XmlRootElement và thông tin phần tử gốc cần thiết để đến từ số JAXBElement. Điều này có nghĩa là khi bạn thực hiện thao tác chưa sửa đổi, bạn cũng sẽ nhận được JAXBElement.

JAXBElement<MyQueryComplexTypeQuery> o = (JAXBElement<MyQueryComplexType>) u.unmarshal(new StringReader(theXML)); 

Không:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML)); 

Để biết thêm thông tin

+3

Đó là tuyệt vời nhờ Blaise. Nó hiện đang làm việc với cả JAXBContext.newInstance ("your.package.name") và sử dụng JAXBElement để unmarshal. Nếu tôi có thể +100 tôi sẽ làm. – Andez

+2

@Andez Bạn thực sự có thể +100. Bạn có thể cung cấp cho bounties sau khi thực tế. – CorayThan

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