2012-01-05 28 views
13

Tôi đang gặp sự cố với việc không sửa đổi JAXB. Tôi nghĩ rằng tôi có nó đúng mã hóa, nhưng đối tượng unmarshalled của tôi trả về với các tham số null. Do đó, tôi giả định rằng khi unmarshalling, JAXB không nhìn thấy cấu trúc XML thích hợp mà nó đang mong đợi. Tuy nhiên, tôi không nhận được bất kỳ thông báo lỗi hoặc bất kỳ trường hợp ngoại lệ ném.Làm thế nào để gỡ lỗi JAXB unmarshalling?

Có cách nào để thực hiện quá trình unmarshalling để xem chính xác nơi/tại sao nó không thể cư trú (các) đối tượng của tôi?

Mã unmarshalling thực tế là khá nhàm chán:

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException { 
    // Creating an unmarshaller 
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller(); 

    // unmarshal an instance node into Java content 
    return clazz.cast(u.unmarshal(node, clazz).getValue()); 
} 

Tuy nhiên, khi tôi gọi nó, tôi nhận được một đối tượng kiểu clazz trả lại (như mong đợi), nhưng không có dân.

Đối tượng DOM mà tôi đang cố gắng so sánh được tạo bởi API của bên thứ ba. Tôi đã chạy vào một số hành vi cực kỳ kỳ lạ với unmarshalling, đó là lý do tại sao tôi muốn có thể gỡ lỗi quá trình. Ví dụ, nếu tôi cố gắng để unmarshal một tiểu phần tử trong đối tượng DOM (ví dụ: doc.getByElementName ("myElement"). Item (0)), nó không âm thầm. Tuy nhiên, nếu tôi chuyển đổi tài liệu thành một chuỗi và nhập lại nó thành một tài liệu mới, thì nó sẽ chuyển đổi nó thành tiền phạt.

Tôi bắt đầu thấy khá thất vọng khi không biết cách gỡ lỗi vấn đề này.

Cảm ơn mọi thông tin chi tiết!

Eric

Trả lời

7

Một cách tiếp cận bạn có thể thực hiện là sử dụng JAXB để tạo ra một lược đồ XML từ các lớp học chú thích của bạn. Điều này đại diện cho những gì JAXB mong đợi tài liệu đầu vào trông như thế nào. Sau đó xác nhận hợp lệ tài liệu XML của bạn dựa vào lược đồ XML này để xem nó có phù hợp với các kỳ vọng của JAXB hay không.

+0

Cảm ơn bạn đã liên kết. Chưa bao giờ thử điều đó trước đây; Sẽ thử nó một lần. Nhưng với điều đó tôi đã tạo ra các lớp JAXB từ một XSD, nó có vẻ như quay ngược lại. Nhưng tôi vẫn không tìm thấy nó là một giải pháp thanh lịch. JAXB hoạt động như một chiếc hộp đen hoàn chỉnh, và không có bất kỳ chỉ báo nào giải thích những gì nó đang làm, tôi không biết tại sao nó lại thất bại. Tôi rất thích tìm một phương pháp để cho phép tôi "xem" những gì nó đang làm và/hoặc những vấn đề nằm ở đâu. –

+0

Cảm ơn bạn đã đề xuất. Tôi đã thử sử dụng trình duyệt tính hợp lệ và nó đang ném một lỗi mà tôi không hiểu. Tôi đã tạo ra một chuỗi riêng biệt cho điều đó (http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme). Nếu bạn có thể đề xuất bất cứ điều gì, tôi sẽ đánh giá cao nó. Cảm ơn. –

+0

Thật vậy, đó là cách tiếp cận tốt nhất tôi đã tìm thấy cho đến nay bởi vì [phương pháp tiếp cận khác] (http://stackoverflow.com/a/10227684/1864054) chỉ đơn giản là không mang lại kết quả tốt và/hoặc hiệu quả. Tuy nhiên, tôi khuyên bạn không nên sử dụng 'soapUI' để tạo các thư kiểm tra vì nó tạo ra một khung thư mà không có bất kỳ giá trị dữ liệu giả mạo nào, buộc bạn phải nhập mọi thứ dễ bị lỗi, đặc biệt là các thư lớn. Thay vào đó, XMLSpy của Altova hoạt động rất tốt. Tất cả những gì bạn cần làm là chọn mục 'tạo yêu cầu SOAP mới 'từ trình đơn' SOAP' và, thì đấy !, bạn nhận được một thông báo hoàn toàn làm việc (giả). – Withheld

10
JAXBContext context = JAXBContext.newInstance(jaxbObjectClass); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
+1

Một hoặc hai bình luận về cách đoạn mã này trả lời câu hỏi DefaultValidationEventHandler là trình xử lý JAXB 1.0 cũ - phải không? Bạn có cho rằng đây là câu trả lời vì trình xử lý cũ sẽ nhổ ra các thông báo lỗi dài hơn không? – Ryan

+0

Từ javadocs: public class DefaultValidationEventHandler mở rộng đối tượng thực hiện ValidationEventHandler JAXB 1.0 chỉ mặc định xử lý sự kiện xác nhận. Đây là trình xử lý mặc định cho tất cả các đối tượng được tạo từ một JAXBContext đang quản lý mã có nguồn gốc từ lược đồ được tạo bởi trình biên dịch liên kết JAXB 1.0. Trình xử lý này khiến các hoạt động không hợp nhất và xác thực không thành công trên lỗi đầu tiên hoặc lỗi nghiêm trọng. – superbAfterSemperPhi

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