2016-01-24 127 views
0

我想定製在web服務上使用的實體的包名稱。主要目標是在不同的web服務之間共享實體。jaxws wsdl公共實體

我使用jaxws + jaxb將實體綁定到相應的包。 但是,只有到實體的ObjectFactory鏈接正在工作。看來我無法重寫使用wsdl:定義:@targetnamespace包名稱。

下面是一個例子:

我有一個FooBarRemoteService retourning兩個實體:Foo和Bar。它們中的每一個都是用定義的名稱空間(Foo:com.test.foo,Bar:com.test.bar)註釋的@XmlRootElement。

這裏是WSDL:

<wsdl:definitions name="FooBarRemoteService" targetNamespace="com.test.foobar" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="com.test.foobar" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http"> 
    <wsdl:types> 
     <xs:schema elementFormDefault="unqualified" targetNamespace="com.test.foobar" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns2="com.test.bar" xmlns:ns1="com.test.foo"> 
     <xs:import namespace="com.test.foo"/> 
     <xs:import namespace="com.test.bar"/> 
     <xs:element name="getBar" type="tns:getBar"/> 
     <xs:element name="getBarResponse" type="tns:getBarResponse"/> 
     <xs:element name="getFoo" type="tns:getFoo"/> 
     <xs:element name="getFooResponse" type="tns:getFooResponse"/> 
     <xs:complexType name="getFoo"> 
      <xs:sequence/> 
     </xs:complexType> 
     <xs:complexType name="getFooResponse"> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="return" type="tns:foo"/> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:complexType name="foo"> 
      <xs:sequence/> 
     </xs:complexType> 
     <xs:complexType name="getBar"> 
      <xs:sequence/> 
     </xs:complexType> 
     <xs:complexType name="getBarResponse"> 
      <xs:sequence> 
       <xs:element minOccurs="0" name="return" type="tns:bar"/> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:complexType name="bar"> 
      <xs:sequence/> 
     </xs:complexType> 
     </xs:schema> 
     <xs:schema targetNamespace="com.test.foo" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="com.test.foobar"> 
     <xs:import namespace="com.test.foobar"/> 
     <xs:element name="foo" type="ns1:foo"/> 
     </xs:schema> 
     <xs:schema targetNamespace="com.test.bar" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="com.test.foobar"> 
     <xs:import namespace="com.test.foobar"/> 
     <xs:element name="bar" type="ns1:bar"/> 
     </xs:schema> 
    </wsdl:types> 
    <wsdl:message name="getFooResponse"> 
     <wsdl:part element="tns:getFooResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getFoo"> 
     <wsdl:part element="tns:getFoo" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getBarResponse"> 
     <wsdl:part element="tns:getBarResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="getBar"> 
     <wsdl:part element="tns:getBar" name="parameters"/> 
    </wsdl:message> 
    <wsdl:portType name="InterfaceFooBar"> 
     <wsdl:operation name="getFoo"> 
     <wsdl:input message="tns:getFoo" name="getFoo"/> 
     <wsdl:output message="tns:getFooResponse" name="getFooResponse"/> 
     </wsdl:operation> 
     <wsdl:operation name="getBar"> 
     <wsdl:input message="tns:getBar" name="getBar"/> 
     <wsdl:output message="tns:getBarResponse" name="getBarResponse"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="FooBarRemoteServiceSoapBinding" type="tns:InterfaceFooBar"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="getFoo"> 
     <soap:operation soapAction="" style="document"/> 
     <wsdl:input name="getFoo"> 
      <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="getFooResponse"> 
      <soap:body use="literal"/> 
     </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="getBar"> 
     <soap:operation soapAction="" style="document"/> 
     <wsdl:input name="getBar"> 
      <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="getBarResponse"> 
      <soap:body use="literal"/> 
     </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="FooBarRemoteService"> 
     <wsdl:port binding="tns:FooBarRemoteServiceSoapBinding" name="FooBar"> 
     <soap:address location="http://localhost:8080/poc/FooBarRemoteService"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

這裏是綁定文件

<?xml version="1.0" encoding="UTF-8"?> 
<jaxws:bindings version="2.1" 
    xmlns:xs="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"> 
    <jaxb:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='com.test.foo']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="subpackage.foo" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
    <jaxb:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='com.test.bar']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="subpackage.bar" /> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxws:bindings> 

這裏是生成Java對象文件的命令:正在生成的

wsimport ../FooBar.wsdl -b ../binding.xml -verbose 

這裏文件:

. 
|-- foobar 
| `-- test 
|  `-- com 
|   |-- Bar.class 
|   |-- FooBarRemoteService.class 
|   |-- Foo.class 
|   |-- GetBar.class 
|   |-- GetBarResponse.class 
|   |-- GetFoo.class 
|   |-- GetFooResponse.class 
|   |-- InterfaceFooBar.class 
|   |-- ObjectFactory.class 
|   `-- package-info.class 
`-- subpackage 
    |-- bar 
    | `-- ObjectFactory.class 
    `-- foo 
     `-- ObjectFactory.class 

將目標文件夾重新命名爲子包文件夾。所以綁定是考慮到的,但只有ObjectFactory存在。他們的方法是讓ObjectFactory的實體依賴於它嗎?

我WSDL用一個簡單的程序下wildfly產生: 這裏是我的文件:

InterfaceFooBar

@WebService(targetNamespace = "com.test.foobar") 
public interface InterfaceFooBar {  
    @WebMethod 
    public Bar getBar(); 
    @WebMethod 
    public Foo getFoo(); 
} 

FooBarRemoteService

@WebService(serviceName = "FooBarRemoteService", 
    portName = "FooBar", 
    name = "FooBar", 
    endpointInterface = "poc.interfaces.helloworld.ws.InterfaceFooBar", 
    targetNamespace = "com.test.foobar") 
public class FooBar implements InterfaceFooBar { 
    @Override 
    public Bar getBar() { 
     return new Bar(); 
    } 
    @Override 
    public Foo getFoo() { 
     return new Foo(); 
    } 
} 

酒吧

@XmlRootElement(namespace = "com.test.bar") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Bar { 
} 

Foo

@XmlRootElement(namespace = "com.test.foo") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo { 
} 

感謝您的回覆。

問候,

達明

回答

0

好吧...我只是找到了響應......

只需使用@XmlType代替@XmlRootElement改變Foo和酒吧的聲明,它是工作...

. 
|-- foobar 
| `-- test 
|  `-- com 
|   |-- FooBarRemoteService.class 
|   |-- GetBar.class 
|   |-- GetBarResponse.class 
|   |-- GetFoo.class 
|   |-- GetFooResponse.class 
|   |-- InterfaceFooBar.class 
|   |-- ObjectFactory.class 
|   `-- package-info.class 
`-- subpackage 
    |-- bar 
    | |-- Bar.class 
    | |-- ObjectFactory.class 
    | `-- package-info.class 
    `-- foo 
     |-- Foo.class 
     |-- ObjectFactory.class 
     `-- package-info.class 

詛咒我花一整天的時間:(