2011-10-24 15 views
9

Điều này khiến tôi phát điên. Tôi có một giản đồ nhúng trong một WSDL mà cần chỉnh vì wsimport được ném các lỗi sauTùy chỉnh JAXB với WSDL kém thành lập

[ERROR] Complex type and its child element share the same name "DomainsMap". 
Use a class customization to resolve this conflict. 
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl 

1) Tôi không có quyền kiểm soát WSDL này như tôi đang xây dựng một WSDL khách hàng đầu tiên và tôi hy vọng nó sẽ đi qua các phiên bản w/o bất kỳ tư vấn chính thức hoặc phát hành cho tôi. 2) Nó không thể chấp nhận được nữa để sửa lỗi va chạm đặt tên theo cách thủ công này bởi vì tôi cần bao gồm việc xây dựng các nhánh vào một chuỗi xây dựng tự động.

Tôi phải sử dụng tệp tùy chỉnh bên ngoài. Tôi dường như không thể tìm ra cách để tùy chỉnh hoạt động.

Đây là đoạn vi phạm WSDL:

<wsdl:definitions> 
    <wsdl:types> 
     <xs:schema> 
     . 
     . 
     . 
     <xs:complexType final="extension restriction" name="domainsMap"> 
     <xs:sequence> 
      <xs:element name="domainsMap"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element maxOccurs="unbounded" minOccurs="0" name="entry"> 
        <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="key" type="xs:string"/> 
         <xs:element minOccurs="0" name="value" type="tns:domainValueMap"/> 
        </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 

Đây sẽ là một cơ hội tuyệt vời để bạn thể hiện sức kỹ năng JAXB của bạn. Mọi sự trợ giúp sẽ rất được trân trọng.

Tôi đã nhìn chằm chằm vào tài liệu jaxb hàng giờ và vẫn không có may mắn. Tôi có thể cung cấp toàn bộ WSDL nếu cần thiết. Có ai giúp được không?

Trả lời

16

Vâng sáng nay tôi đã đi làm và có thể tìm ra điều này. Đôi khi chỉ cần tránh xa vấn đề và quay trở lại với một cái đầu mới là cách tốt nhất. Đây là giải pháp phù hợp với tôi:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxws:bindings 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    wsdlLocation="ArtesiaWebServices.wsdl"> 

    <enableWrapperStyle>true</enableWrapperStyle> 
    <enableAsyncMapping>false</enableAsyncMapping> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType"> 
     <!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainsMapElement"/> 
    </jaxws:bindings> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType"> 
     <!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainValueMapElement"/> 
    </jaxws:bindings> 
</jaxws:bindings> 

Tôi sử dụng tệp ràng buộc bên ngoài bên trên bằng công cụ wsimport trong lệnh sau.

Những điều quan trọng về tập tin liên kết này:

  • Không gian tên cho jaxws bindings được sử dụng. Đây là cách duy nhất tôi có thể chọn lựa nút hoạt động đúng cách
  • Lựa chọn nút phải kết thúc bằng/xs: complexType. Nếu bạn ngừng chọn tên phần tử thì trình biên dịch sẽ tạo ra lỗi.

    wsimport -d tạo -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

Tùy chọn sử dụng:
-d tạo xác định thư mục đầu ra (một thư mục có tên là 'tạo ra' trong trường hợp này)
-b ArtesiaExternalBinding.xml yêu cầu trình biên dịch JAXB sử dụng tệp ràng buộc.
-keep giữ cuống (i chỉ cần sử dụng khai để kiểm tra)

cuối cùng, tôi thấy điều này là miếng ngon nhất hữu ích của thông tin: java.net documents on jaxws customizations

Đây là những gì đưa tôi đến làm tổ trong jaxb tùy chỉnh trong các thẻ jaxws. Cảm ơn bạn đã liên kết Petru Gardea

+1

Cuối cùng! Cảm ơn bạn! Nó giải quyết vấn đề của tôi .. – fachexot

+4

SOAP .... Soo nhiều người đàn ông lãng phí giờ – dolbysurnd

+0

Xa ... Điều này không hoạt động nếu không có thẻ 'jaxws' ma thuật khi sử dụng' wsimport' bên trong trình cắm maven. Cảm ơn. – Strelok

3

Không rõ bạn đã thử hay không, nhưng tôi sẽ làm như sau: - sử dụng tùy chọn -b trong dòng lệnh wsimport (doc có sẵn here). - thông tin về các tệp ràng buộc có thể được tìm thấy here; - Chế độ xem sâu với các ví dụ về cách tùy chỉnh để tránh xung đột tên là here. Tôi đang cung cấp một đoạn trích ở đây - nó sẽ khắc phục vấn đề của bạn.

<jxb:schemaBindings> 
     <jxb:package name="primer.myPo"> 
     <jxb:javadoc> 
    <![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]> 
     </jxb:javadoc> 
     </jxb:package> 
     <jxb:nameXmlTransform> 
      <jxb:elementName suffix="Element"/> 
     </jxb:nameXmlTransform> 
</jxb:schemaBindings> 
+1

Xin lỗi, tôi nghĩ bạn sẽ theo dõi các liên kết tôi đã đính kèm tại đây; liên kết "thông tin về các tệp ràng buộc", được neo trên câu lệnh này: "Các ràng buộc JAXB này có thể sống bên trong lược đồ hoặc là phần tử con của phần tử jaxws: bindings." –

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