2010-11-20 19 views
7

Tôi đang cố gắng để tạo ra các đồ tạo tác cho wsdl amazon sau:
http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdlKhông đếm được tạo ra bởi JAX-WS ri 2.2.1 cho ecs amazon WSDL nộp

bằng cách sử dụng lệnh ant sau:

<taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"> 
    <classpath> 
     <pathelement location="${BUILD_LIBS}/jaxws-ri/lib/jaxws-tools.jar"/> 
    </classpath> 
</taskdef> 

<target name="wsimport" depends="init"> 
    <delete dir="${generated.src}" /> 
    <mkdir dir="${generated.src}"/> 
    <wsimport 
     debug="true" 
    keep="true" 
    verbose="true" 
    destdir="${generated.src}" 
    package="com.amazon.webservices.ecs" 
    wsdl="wsdl/AWSECommerceService.wsdl"/> 
</target> 

nhưng không có hiện vật java được tạo ra cho các phần tử sau đó trông như thế này:

<xs:element name="Condition"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="All"/> 
      <xs:enumeration value="New"/> 
      <xs:enumeration value="Used"/> 
      <xs:enumeration value="Collectible"/> 
      <xs:enumeration value="Refurbished"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

về cơ bản không có sự đếm được tạo ra mặc dù một các phần tử khác sẽ được tạo. đã ai từng gặp vấn đề này trước đó chưa? Tôi đang sử dụng JAX-WS ri 2.2.1 http://jax-ws.java.net/2.2.1/
Cảm ơn

Trả lời

5

như được tham chiếu bởi Puspendu, tùy chỉnh máy khách JAXB của ràng buộc là chính xác/khá gần với những gì bạn cần - bạn cần sử dụng tùy chỉnh máy khách JAX-WS cho ví dụ của bạn. Các tùy chỉnh JAXB và JAX-WS về cơ bản cho phép bạn tăng thêm định nghĩa các phần tử lược đồ cho WSDL/lược đồ mà bạn không kiểm soát. có nhiều thứ khác nhau mà bạn có thể thực hiện như ánh xạ tên phần tử xml cho các phần tử java tùy chỉnh, thay đổi API được tạo và trả lời câu hỏi của bạn, tạo các lớp enum an toàn cho các thành phần bị hạn chế với enum.

Có hai cách/phần để thực hiện tùy chỉnh máy khách cho JAX-WS.

1) nếu WSDL nhập khẩu một tập tin schema bên ngoài 2) nếu WSDL chứa toàn bộ định nghĩa giản đồ mà không cần bất kỳ nhập khẩu

nếu wsdl nhập khẩu một tập tin schema bên ngoài sau đó,

về cơ bản bạn cần tạo một tệp mới (thường là với phần mở rộng jxb, nhưng nó thực sự không quan trọng) rằng bạn sẽ duy trì dọc theo phía wsdl mà bạn đang tạo ra trình khách/api của máy khách. thông thường tôi đặt tên cho các tệp này là schema-file-name_clientcustomization.jxb

mỗi khi bạn nhận được bản cập nhật wsdl, bạn nên xác thực rằng tệp JXB của bạn vẫn hợp lệ cho wsdl đó. Những điều lớn nhất tôi tìm thấy, đặc biệt là với các hạn chế về enum, là những thay đổi giá trị bị hạn chế, thay đổi không gian tên, thay đổi tên loại, v.v.

nội dung của tệp mới này sẽ trông giống như sau:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<jxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"  
    targetNamespace="http://java.sun.com/xml/ns/jaxb" 
    version="1.0"> 

    <jxb:bindings schemaLocation="NameOfYourSchemaFile.xsd" 
     node="/xsd:schema[@targetNamespace='SCHEMANAMESPACE']"> 
     <jxb:schemaBindings> 
      <jxb:package name="com.amazon.webservices.ecs" /> 
     </jxb:schemaBindings> 

     <jxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType"> 
      <jxb:typesafeEnumClass name="ConditionEnum" > 
       <jxb:typesafeEnumMember value="All" name="ALL" /> 
       <jxb:typesafeEnumMember value="New" name="NEW" /> 
       <jxb:typesafeEnumMember value="Used" name="USED" /> 
       <jxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" /> 
       <jxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" /> 
      </jxb:typesafeEnumClass> 
     </jxb:bindings> 
     </jxb:bindings> 
</jxb:bindings> 

Về cơ bản tệp này xác định tăng cường cần được thực hiện đối với tệp xsd được tham chiếu. tất cả các phần tử liên kết trong tệp này có thuộc tính nút là biểu thức XPATH, chọn mục lược đồ mà bạn muốn tăng thêm. trong ví dụ này, tôi không có bất kỳ không gian tên hoặc thông tin nào khác vì vậy tôi đã chỉ định XPATH để chỉ chọn khai báo kiểu đơn giản của phần tử.trong ràng buộc đó, chúng ta định nghĩa lớp typesafeenum, điều này làm cho jaxb/wsimport tạo ra một lớp enum để biểu diễn kiểu đơn giản được tham chiếu. vì nó là một kiểu đơn giản ẩn danh, nên nó định nghĩa một lớp chỉ dành cho phần tử được tham chiếu. Lớp được tạo ra sẽ là ENUM của những người nhớ được định nghĩa bởi thuộc tính "name" của phần tử typesafeEnumMember.

sử dụng tập tin JXB này, bạn cần phải tham khảo nó trong nhiệm vụ kiến ​​của bạn, như vậy:

<wsimport 
     debug="true" 
    keep="true" 
    verbose="true" 
    destdir="${generated.src}" 
    package="com.amazon.webservices.ecs" 
    wsdl="wsdl/AWSECommerceService.wsdl"> 

    <binding dir="wsdl" includes="*.jxb"/> 

</wsimport> 

nếu WSDL định nghĩa toàn bộ đồ nội, sau đó bạn cần phải sử dụng một tập tin tùy biến JAX-WS . Trường hợp này là những gì phù hợp với câu hỏi của bạn.

http://jax-ws.java.net/nonav/2.1.7/docs/customizations.html

JAX-WS khách hàng tùy biến rất giống với các tùy biến JAXB. Ý tưởng này giống hệt nhau, phần lớn phần JAX-WS của tệp tùy chỉnh sẽ thay đổi các tạo phẩm được tạo cụ thể liên quan đến WSDL, trong khi tùy chỉnh JAXB được nhúng thực hiện cùng chức năng như một tệp tùy chỉnh bên ngoài: trên lược đồ.

Sự khác biệt lớn là thay vì nói cho trình phân tích cú pháp JAXB nơi tệp lược đồ là, bạn cung cấp phần ràng buộc chọn định nghĩa lược đồ (sử dụng XPATH) mà bạn muốn áp dụng tùy chỉnh.

Ví dụ này tôi thực sự đã kiểm tra và xác minh để tạo lớp Enum cho phần tử bạn đang đặt câu hỏi, vì vậy bạn có thể sao chép nguyên mẫu ví dụ tùy chỉnh JAX-WS này.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<jaxws:bindings 
     wsdlLocation="AWSECommerceService.wsdl" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    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" 
    > 

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='http://webservices.amazon.com/AWSECommerceService/2010-11-01']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="com.amazon.webservices.ecs"/> 
     </jaxb:schemaBindings> 


     <jaxb:bindings node="xsd:element[@name='Condition']/xsd:simpleType"> 
      <jaxb:typesafeEnumClass name="ConditionEnum" > 
       <jaxb:typesafeEnumMember value="All" name="ALL" /> 
       <jaxb:typesafeEnumMember value="New" name="NEW" /> 
       <jaxb:typesafeEnumMember value="Used" name="USED" /> 
       <jaxb:typesafeEnumMember value="Collectible" name="COLLECTIBLE" /> 
       <jaxb:typesafeEnumMember value="Refurbished" name="REFURBISHED" /> 
      </jaxb:typesafeEnumClass> 
     </jaxb:bindings> 

    </jaxws:bindings> 

</jaxws:bindings> 

sau đó bạn sẽ tham chiếu tệp tùy chỉnh JAX-WS này giống như cách bạn tham chiếu tệp JXB.

Tôi không xác thực ví dụ tùy chỉnh JAXB độc lập, vì tôi thực sự chỉ đưa nó làm ví dụ và làm giải thích tiền thân cho ví dụ tùy chỉnh JAX-WS.

Ví dụ tùy chỉnh JAX-WS tôi đã thực sự kiểm tra/xác thực đối với WSDL mà bạn đã liên kết, vì vậy bạn có thể sử dụng nó làm điểm bắt đầu. Tôi nhận thấy rằng có rất nhiều hạn chế liệt kê trong WSDL được định nghĩa, vì vậy tôi cho rằng bạn sẽ muốn tạo ra enums cho hầu hết/tất cả chúng.

Tôi hy vọng điều này sẽ hữu ích.

1

Sử dụng typesafeEnumMember trong JAXB-Binding

Ref: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html#wp148439

Hoặc

Something như thế này [thêm name =" Loại điều kiện "]:

<xs:simpleType name="ConditionType"> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="All"/> 
       <xs:enumeration value="New"/> 
       <xs:enumeration value="Used"/> 
       <xs:enumeration value="Collectible"/> 
       <xs:enumeration value="Refurbished"/> 
      </xs:restriction> 
     </xs:simpleType> 
+0

Xin cảm ơn câu trả lời của bạn. Bạn sẽ có thể xây dựng trên đó? Tôi không kiểm soát các tập tin wsdl nó đến từ Amazon. –

+0

@leftbrainlogic nếu cách được mô tả bởi Helter trông khó theo, chỉ cần thêm thuộc tính 'name' vào nút simpleType corrensponding xs: liệt kê –

+1

nếu bạn không sở hữu WSDL, sau đó chỉnh sửa nó cho phù hợp với nhu cầu của bạn không phải là tùy chọn rất khả năng mở rộng. bạn sẽ phải thực hiện lại việc chỉnh sửa, mỗi khi bạn nhận được phiên bản mới của wsdl. đây chính xác là trường hợp tùy chỉnh phía máy khách được xây dựng cho. nếu bạn không có vấn đề với chỉnh sửa và chỉnh sửa lại wsdl, bạn có thể cấu trúc lại kiểu bên trong vô danh của phần tử Condition thành một kiểu đơn giản có tên thích hợp, và nó sẽ tạo ra một lớp enum, tuy nhiên điều đó không thực tế bạn nhận được một WSDL mới, đặc biệt là với số lượng enums được định nghĩa trong wsdl amazon. –

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