2013-05-15 39 views
10

Tôi tạo ra một dịch vụ web sử dụng:ADBException: bất ngờ subelement

  • Apache Axis 2 codegen Hướng dẫn v.1.6.2 (Binding: ADB)
  • Eclipse Juno
  • Tomcat 7
  • Java 6

Dịch vụ trả về đối tượng Java tùy chỉnh (DataBean) trở lại máy khách, nhưng tôi tình cờ gặp một ngoại lệ trong mã máy khách:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message 

Từ những gì tôi đã nghiên cứu, qua n lần nữa ... Tôi nghĩ đây là một vấn đề rất phổ biến nhưng chưa có câu trả lời kết luận về những gì cần phải làm để khắc phục.

Một số bài đăng trên diễn đàn này và các diễn đàn khác cho biết rằng WSDL cần phải được sửa đổi (một số không gian tên) hoặc danh sách khách hàng cần sửa đổi. Một số thậm chí còn nói rằng có một lỗi trong ADB. Nó chắc chắn là một lỗi trong các phiên bản trước của Axis nhưng có nhiều bài viết trong kho lưu trữ thư nói rằng lỗi đã được sửa. Các lưu trữ gửi thư này liên quan đến các phiên bản trước của Axis2.

Bây giờ câu hỏi của tôi là:

  1. Là nó vẫn còn một lỗi?
  2. Chính xác những gì cần phải được thay đổi trong WSDL hoặc Sơ khai khách hàng?

Điều đáng nói là tôi đã tạo một dịch vụ web tương tự trả về "Chuỗi" cho khách hàng. Nó hoạt động tốt ! Vì vậy, nó không thành công khi một kiểu dữ liệu phức tạp có liên quan.

Có một số thông tin về Apache's website, dưới tiêu đề "Known Hạn chế" ...

Nó đọc: "ADB được hiểu là một khuôn khổ liên kết dữ liệu 'đơn giản' và không có nghĩa là để biên dịch tất cả loại lược đồ. những hạn chế sau đây được nêu bật nhất.

  1. loại Extensions và hạn chế Complex ".

Đó có phải là sự cố không?

Sau đây là đoạn từ tập tin WSDL mà có thể là của một số quan tâm đến bạn ...

<wsdl:types> 
     <xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs"> 
      <xs:import namespace="http://mywebservice/xsd"/> 
      <xs:element name="getMsg"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="getMsgResponse"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
     <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd"> 
      <xs:complexType name="DataBean"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/> 
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:schema> 
    </wsdl:types> 

Bây giờ làm thế nào để khắc phục vấn đề này? Tôi có nên bao gồm một số đoạn mã khác ở đây không?

Trả lời

1

Mã được tạo bởi CodeGen (từ WSDL) cho đối tượng Java (bean) mà tôi đang sử dụng, dự kiến ​​một không gian tên khác cho các trường trong bean. Bằng cách nào đó một không gian tên không chính xác đã có mặt trong mã được tạo ra bởi Axis. Tôi đã sửa không gian tên để phản ánh những gì nó cần phải có và mọi thứ hoạt động tốt. Tôi có thể thấy mọi người vẫn trả lời câu hỏi này vì vậy tôi nghĩ tôi sẽ đăng lại giải pháp của mình ở đây (đã đăng bài này để đáp lại giải pháp của Kenster). Vì không có giải pháp nào được đăng trước khi tôi tìm giải pháp làm việc, tôi không chấp nhận bất kỳ câu trả lời nào.

10

"Subelement không mong đợi" có nghĩa là thông điệp mà người nhận nhận được chứa phần tử XML mà người nhận không mong đợi. "{schemaTargetNs} message" là tên của phần tử không mong muốn mà nó gặp phải. Nói cách khác, người gửi đã gửi một tin nhắn không hợp lệ đến người nhận.

  • Người gửi có thể đã bao gồm yếu tố không được yêu cầu.
  • Người gửi có thể đã bỏ qua yếu tố bắt buộc.
  • Người gửi có thể đã đặt các phần tử theo thứ tự sai.
  • Người gửi có thể đã gửi một thông báo hoàn toàn không chính xác.

Nếu máy chủ phát hành ngoại lệ mà bạn báo cáo, khi đó khách hàng đã gửi thư không hợp lệ đến máy chủ. Nếu khách hàng đã ban hành ngoại lệ, thì lỗi trong phản hồi từ máy chủ đến máy khách.

+0

Lỗi này chắc chắn là trong phản hồi từ máy chủ, nhưng làm thế nào để tìm ra yếu tố nào được mong đợi? Trừ khi tôi biết điều đó, tôi sẽ không thể sửa chữa mọi thứ. Tôi có phản hồi XML từ máy chủ và nó có vẻ tốt với tôi. –

+0

Vâng, nếu bạn chạy ứng dụng khách trong trình gỡ lỗi và/hoặc nếu bạn có stacktrace cho org.apache.axis2.AxisFault, thì bạn có thể tìm thấy dòng mã cụ thể trong trình phân tích cú pháp thư đang ném lỗi . Nó sẽ được rõ ràng vào thời điểm đó những gì yếu tố nó được mong đợi. – Kenster

+0

Điều này có lẽ sẽ đi xuống đến thực tế là khách hàng đã được tạo ra dựa trên một bản sao không chính xác của WSDL. Vì vậy, phản hồi được gửi bởi máy chủ không khớp với những gì khách hàng mong đợi. – Kenster

5

nếu xsd (wsdl) đúng với yêu cầu xml o phản hồi là do sự cố là thứ tự của các phần tử xml. Một giải pháp khả thi là tạo ứng dụng khách axis2 của bạn với tùy chọn -Video. làm việc cho tôi.

+0

Làm việc cho tôi! –

0

Khi tôi kiểm tra mã trục, tôi tìm thấy những điều sau

if(new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName())) 

đây là nơi mà lỗi xảy ra, . phương thức equals() của QName kiểm tra localPart & namespaceURI . nhưng reader.getName() không có namespace URI bộ và do đó các lỗi happend

tôi đã thay đổi tất cả nếu kiểm tra từ

if(new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName())) 

để

if(new javax.xml.namespace.QName("someElementName").equals(reader.getName())) 

và nó làm việc tốt cho tôi

0

Lỗi này có thể gây nhầm lẫn. Sau khi tôi sửa đổi WSDL và thêm một phần tử bắt buộc mới, tôi đã tạo khách hàng của mình. Hơn lỗi này xuất hiện. Giải pháp là, tôi quên điền phần tử này vào một phương thức của dịch vụ web của tôi. Nếu lỗi này xuất hiện, hãy kiểm tra xem các phần tử bắt buộc của bạn có được điền trong máy chủ hay không.

1

Xem tệp .xsd của bạn. Sắp xếp các phần tử xs của bạn theo thứ tự abc bên dưới số <xs:extension base=...> của bạn. Điều đó sẽ phù hợp với nhu cầu của bạn.

0

trong trường hợp của tôi, Dịch vụ web đang gửi các phần tử theo thứ tự khác với thứ tự trên xsd. Tôi đang sửa đổi cái cuống ngay bây giờ để trật tự không quan trọng, bởi vì tôi không có cơ hội thay đổi Dịch vụ Web.