2013-01-25 31 views
1

我目前嘗試使用Websphere中提供的Emitter類(與Java2WSDL工具相同)從java源生成JAX-RPC webservices。我目前使用WAS6.1和WAS7.0進行測試。問題是,當我嘗試爲'FooRequest'生成WSDL時,ComplexType'Foo'缺少wsdl中定義的Bar []。當我改變'FooRequest'返回Bar []時,wsdl正確生成,一切正常。JAX-RPC WebService不在WSDL中生成java數組

爲什麼wsdl中沒有正確生成數組?
有什麼我做錯了嗎?
什麼是用數組生成wsdl的正確方法?


Foo.Java

package test; 

import com.ibm.ws.webservices.wsdl.fromJava.Emitter; 

public class Foo { 

    private Bar[] bars; 

    private Bar bar; 

    private String[] data; 

    public Bar[] getBars() { 
     return bars; 
    } 

    public void setBars(Bar[] bars) { 
     this.bars = bars; 
    } 

    public Bar getBar() { 
     return bar; 
    } 

    public void setBar(Bar bar) { 
     this.bar = bar; 
    } 

    public String[] getData() { 
     return data; 
    } 

    public void setData(String[] data) { 
     this.data = data; 
    } 

    public static void main(String[] args) { 
     Emitter parser = new Emitter(); 

     parser.setCls("test.FooRequest"); 
     parser.setLocationUrl("http://localhost:8080/services/doFooService"); 

     // Set style/use 
     parser.setStyle("document"); 
     parser.setUse("literal"); 

     parser.setIntfNamespace("urn:doFooService"); 
     parser.setClasspath("C:\\temp\\foo"); 

     parser.setWrapped(true); 

     // Generate WSDL 
     try { 
      parser.emit("C:\\temp\\foo\\Foo.wsdl"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Bar.java

package test; 

public class Bar { 

    private String baz; 

    public String getBaz() { 
     return baz; 
    } 

    public void setBaz(String baz) { 
     this.baz = baz; 
    } 
} 

FooRequest.java

package test; 

public class FooRequest { 

    public Foo getFoo(String input) { 
     Foo foo = new Foo(); 
     Bar[] bars = new Bar[5]; 
     Bar bar; 
     for (int i = 0; i < bars.length; i++) { 
      bar = new Bar(); 
      bar.setBaz("baz:" + (i + 1)); 
      bars[i] = bar; 
     } 
     foo.setBars(bars); 
     bar = new Bar(); 
     bar.setBaz("Power Bar"); 
     foo.setBar(bar); 

     String[] data = new String[5]; 
     for (int i = 0; i < data.length; i++) { 
      data[i] = "baz:" + (i + 1); 
     } 
     return foo; 
    } 
} 

Foo.wsdl

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:impl="urn:doFooService" xmlns:intf="urn:doFooService" xmlns:tns1="http://test" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:doFooService"> 
    <wsdl:types> 
     <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:doFooService"> 
      <import namespace="http://test" /> 
      <element name="getFooResponse"> 
       <complexType> 
        <sequence> 
         <element name="getFooReturn" nillable="true" type="tns1:Foo" /> 
        </sequence> 
       </complexType> 
      </element> 
      <element name="getFoo"> 
       <complexType> 
        <sequence> 
         <element name="input" nillable="true" type="xsd:string" /> 
        </sequence> 
       </complexType> 
      </element> 
     </schema> 
     <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://test"> 
      <complexType name="Foo"> 
       <sequence> 
        <element name="bar" nillable="true" type="tns1:Bar" /> 
       </sequence> 
      </complexType> 
      <complexType name="Bar"> 
       <sequence> 
        <element name="baz" nillable="true" type="xsd:string" /> 
       </sequence> 
      </complexType> 
     </schema> 
    </wsdl:types> 
    <wsdl:message name="getFooResponse"> 
     <wsdl:part element="impl:getFooResponse" name="parameters" /> 
    </wsdl:message> 
    <wsdl:message name="getFooRequest"> 
     <wsdl:part element="impl:getFoo" name="parameters" /> 
    </wsdl:message> 
    <wsdl:portType name="FooRequest"> 
     <wsdl:operation name="getFoo"> 
      <wsdl:input message="impl:getFooRequest" name="getFooRequest" /> 
      <wsdl:output message="impl:getFooResponse" name="getFooResponse" /> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="doFooServiceSoapBinding" type="impl:FooRequest"> 
     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
     <wsdl:operation name="getFoo"> 
      <wsdlsoap:operation soapAction="" /> 
      <wsdl:input name="getFooRequest"> 
       <wsdlsoap:body use="literal" /> 
      </wsdl:input> 
      <wsdl:output name="getFooResponse"> 
       <wsdlsoap:body use="literal" /> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="FooRequestService"> 
     <wsdl:port binding="impl:doFooServiceSoapBinding" name="doFooService"> 
      <wsdlsoap:address location="http://localhost:8080/services/doFooService" /> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

回答

-1

我發現的情況下,任何人發現在未來這個問題的解決方案。

的問題是,我以前從舊的WebSphere 6.1的安裝得到罐子:

  • bootstrap.jar
  • classloader.jar
  • emf.jar
  • ffdc.jar
  • j2ee.jar
  • ras.jar
  • wccm_base.jar
  • webserverices.jar
  • wsdl4j.jar
  • wsexception.jar

這些罐子已通過其他未知其他被傳給我,沒有版本號或元數據的任何形式的。我不知道他們是否是完整的真實版本,但他們工作。最初,我使用提供的websphere 6.1 JRE(java 1.5)來使用它們,但正如我現在正在部署到websphere 7.0,我更改了我的軟件以使用websphere 7.0(java 1.6)。我不知道的是,jar和java 1.5版本是彼此特定的,所以當使用java 1.6 JRE時,Emitter類不會失敗,只需生成一個不正確的wsdl。

爲了解決這個問題,我只是將軟件改回到使用java 1.5 JRE,直到我有時間更正jar。