2012-06-20 17 views
10

Tôi đang sử dụng JAXB XMLadapter cho các giá trị Boolean nguyên soái và không thay đổi. Tệp XML của ứng dụng cũng sẽ được ứng dụng C# truy cập. Chúng ta phải xác nhận hợp lệ tệp XML này và điều này được thực hiện bằng cách sử dụng XSD. Ứng dụng C# ghi giá trị "True" cho các nút Boolean. Nhưng điều tương tự cũng được xác nhận bởi XSD của chúng tôi vì nó chỉ cho phép "true/false" hoặc "1/0". Vì vậy, chúng tôi đã giữ String cho các giá trị boolean trong XSD và chuỗi đó sẽ được xác thực bởi XMLAdapter để soái và không thay đổi về phía chúng ta. Các Adaptor XML như sau: Phương pháp JAXB XMLAdapter không ném ngoại lệ

public class BooleanAdapter extends XmlAdapter<String, Boolean> 
{ 
@Override 
    public Boolean unmarshal(String v) throws Exception 
    { 
     if(v.equalsIgnoreCase("true") || v.equals("1")) 
     { 
      return true; 
     } 
     else if(v.equalsIgnoreCase("false") || v.equals("0")) 
     { 
      return false; 
     } 
     else 
     { 
      throw new Exception("Boolean Value from XML File is Wrong."); 
     } 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception 
    { 
     return v.toString();   
    } 
} 

Đoạn mã trên làm việc trong điều kiện bình thường, nhưng khi dữ liệu không hợp lệ (ví dụ: "abcd" hoặc "") được đọc từ file xml sau đó là "ném ngoại lệ mới(); " không được tuyên truyền và quá trình Unmarshal chuyển sang đọc nút tiếp theo. Tôi muốn ứng dụng dừng ngay sau khi ngoại lệ được ném. Dường như ngoại lệ của tôi đang bị ăn mất. Bất kỳ trợ giúp nào được đánh giá cao.

Cách khắc phục sự cố này?

Trả lời

17

Từ javadoc của XMLAdapter#unmarshal(ValueType):

Ném: java.lang.Exception - nếu có một lỗi trong quá trình chuyển đổi. Người gọi chịu trách nhiệm báo cáo lỗi cho người dùng thông qua ValidationEventHandler.

Vì vậy, có - ngoại trừ là ăn và sau đó báo cáo sử dụng ValidationEventHandler, không ném lên đỉnh ngăn xếp của bạn.

Kiểm tra nếu bạn đang sử dụng bất kỳ (tùy chỉnh, có lẽ) ValidationEventHandler rằng các nhóm ngoại lệ của bạn, hoặc sử dụng DefaultValidationEventHandler, như thế này:

unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

Nó sẽ gây ra thất bại unmarshalling về lỗi đầu tiên.

+0

Cảm ơn bạn @npe: Đã hoạt động ..! :) không biết nhiều về ValidationEventHandler() nhưng con trỏ của bạn tới JavaDoc đã giúp ích rất nhiều. Chỉ cần đặt unmarshaller.setEventHandler (new DefaultValidationEventHandler()); đã thực hiện công việc .. Đánh dấu giải pháp của bạn là câu trả lời .. Chúc mừng ..! –