0

我想自定义 Web 服务上使用的实体的包名称。主要目标是在不同的 Web 服务之间共享实体。

我正在使用 jaxws + jaxb 将实体绑定到它们相应的包。但是,只有指向实体的 ObjectFactory 链接有效。似乎我无法覆盖使用 wsdl:definition:@targetnamespace 作为包名称。

这是一个例子:

我有一个 FooBarRemoteService 重新访问两个实体:Foo 和 Bar。它们中的每一个都是用定义的命名空间注释的@XmlRootElement(Foo:com.test.foo,Bar:com.test.bar)。

这是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 下的一个简单程序生成的:这是我的文件:

界面FooBar

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

FooBar远程服务

@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 {
}

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

感谢您的回复。

问候,

达米安

4

1 回答 1

0

好的...我刚刚找到响应...

只需使用 @XmlType 而不是 @XmlRootElement 更改 Foo 和 Bar 的声明,它就可以工作......

.
|-- 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

该死的,我花了一天时间:(

于 2016-01-24T01:22:49.017 回答