首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >能否将jaxb2-basics配置为为泛型对象的类型变量指定接口?

能否将jaxb2-basics配置为为泛型对象的类型变量指定接口?
EN

Stack Overflow用户
提问于 2011-08-23 06:55:19
回答 1查看 2.8K关注 0票数 3

我正在使用jax-ws的wsimport从WSDL生成java类。我正在使用jaxb2-basics插件来创建toString、equals、hashCode、copy和merge方法。

我希望生成的类实现接口,以便在需要更改代码时将代码与实现隔离。

我想使用jaxb2的能力来生成实现特定接口的类,但只取得了有限的成功。仅由类实现接口是不够的。我希望由其他生成的类组成的生成的类在引用这些对象时使用接口而不是实现。

我使用一个外部绑定文件来定义一个类应该实现的接口:

代码语言:javascript
复制
<jaxws:bindings

xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
            xmlns:s="http://www.w3.org/2001/XMLSchema"
           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
           wsdlLocation="ExampleService.wsdl"
           xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
           jaxb:extensionBindingPrefixes="inheritance">

<!-- Person -->
<jaxws:bindings node="wsdl:definitions/wsdl:types/s:schema[@targetNamespace='http://example.com/ws']">
    <jaxb:bindings node="//s:complexType[@name='Person']">
            <inheritance:implements>com.example.IPerson</inheritance:implements>
    </jaxb:bindings>
</jaxws:bindings>

<!-- Bus -->
<jaxws:bindings node="wsdl:definitions/wsdl:types/s:schema[@targetNamespace='http://example.com/ws']">
    <jaxb:bindings node="//s:complexType[@name='Bus']">
            <inheritance:implements>com.example.IBus</inheritance:implements>
            <jaxb:bindings node="//s:element[@name='Driver']">
                <jaxb:class ref="com.example.IPerson"/>
            </jaxb:bindings>
            <!-- How to do this? This doesn't work.
            <jaxb:bindings node="//s:element[@name='Passengers']">
                <jaxb:class ref="java.util.List&lt;com.example.IPerson&gt;"/>
            </jaxb:bindings>
             -->

    </jaxb:bindings>
</jaxws:bindings>

例如,如果我有一个名为Bus的类,其中有一个名为Person的类,我想让Bus实现IBus,让Person实现IPerson,让Bus有一个IPerson类型的成员变量,而不是Person。

代码语言:javascript
复制
public Class Bus implements IBus {

    protected IPerson driver;
    ...
}

我在绑定文件中的内容是有效的。

但是,如果Bus有一个Person对象列表,我就不能让wsimport为Bus生成一个定义IPerson对象列表的类。

代码语言:javascript
复制
public Class Bus implements IBus {

    protected IPerson driver;
    protected List<IPerson> passengers;
    ...
}

下面是我使用的示例wsdl (非常愚蠢的示例,但它很好理解):

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns="http://example.com/ws"
xmlns:s1="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://example.com/ws"
name="BusServiceDefinitions">

<types>
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    attributeFormDefault="qualified"
    elementFormDefault="qualified"
    targetNamespace="http://example.com/ws">
    <xs:element name="BusRequest" type="ns:BusRequest"/>
    <xs:element name="BusResponse" type="ns:BusResponse"/>
    <xs:complexType name="Bus">
      <xs:sequence>
        <xs:element name="Driver" type="ns:Person" minOccurs="1" maxOccurs="1"/>
        <xs:element name="Passengers" type="ns:Person" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Person">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BusRequest">
      <xs:sequence>
        <xs:element name="person" type="xs:string" minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="BusResponse">
      <xs:sequence>
        <xs:element name="bus" type="xs:string" minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
 </xs:schema>
</types>

<message name="BusRequest">
  <part name="BusRequest" type="ns:BusRequest"/>
</message>
<message name="BusResponse">
  <part name="Bus" type="ns:Bus"/>
</message>

<portType name="Bus_PortType">
  <operation name="createBus">
     <input message="ns:BusRequest"/>
     <output message="ns:BusResponse"/>
  </operation>
</portType>

<binding name="Bus_Binding" type="ns:Bus_PortType">
 <s1:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="createBus">
     <s1:operation soapAction="createBus"/>
     <input>
     </input>
     <output>
     </output>
  </operation>
</binding>

<service name="Bus_Service">
  <documentation>WSDL File for HelloService</documentation>
  <port binding="ns:Bus_Binding" name="Bus_Port">
     <s1:address
        location="http://localhost:8080/soap/servlet/rpcrouter"/>
  </port>
 </service>
 </definitions>

这是我的pom:

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jaxws-test</groupId>
  <artifactId>jaxws-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>jaxws-test</name>
  <dependencies>
    <dependency>
      <groupId>com.sun.xml.ws</groupId>
      <artifactId>jaxws-rt</artifactId>
      <version>2.2.3</version>
    </dependency>
    <dependency>
      <groupId>org.jvnet.jaxb2_commons</groupId>
      <artifactId>jaxb2-basics</artifactId>
      <version>0.6.2</version>
    </dependency>
    <dependency>
      <groupId>org.jvnet.jaxb2_commons</groupId>
      <artifactId>jaxb2-basics-runtime</artifactId>
      <version>0.6.2</version>
    </dependency>
  </dependencies>
  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
      <resource>
        <directory>src/main/wsdl</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>2.4.1</version>
        <executions>
          <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
           </execution>
         </executions>
          <configuration>
            <verbose>true</verbose>
            <wsdlOptions>
                <wsdlOption>
                    <wsdl>src/main/wsdl/ExampleService.wsdl</wsdl>
                    <extraargs>
                    <extraarg>-xjc-Xinheritance</extraarg>
                    </extraargs>
                    <bindingFiles>
                        <bindingFile>src/main/wsdl/ExampleBindings.xml</bindingFile>
                    </bindingFiles>
                </wsdlOption>
            </wsdlOptions>
          </configuration>
        <dependencies>
           <dependency>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics</artifactId>
                <version>0.6.2</version>
            </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
        <id>maven2-repository.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/2/</url>
        <layout>default</layout>
    </repository>
  </repositories>
</project>

有没有人知道是否有可能使用jaxb2基础知识来生成在jaxb绑定文件中指定类型变量的泛型对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-12 02:17:28

不,目前是不可能的。

更新

这现在已经在0.6.4中实现了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7154563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档