我想定製在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 {
}
感謝您的回覆。
問候,
達明