2016-01-24 72 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 

诅咒我花一整天的时间:(