You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JAXWS插件从WSDL生成实现通用接口的Java类遇问题求助

问题描述

我有包含如下类型的WSDL文件:

<xs:complexType name="someName">
....
</xs:complexType>

<xs:complexType name="someOtherName">
....
</xs:complexType>

希望这些类型能实现通用接口:

public interface Test {
//methods that already exist in the types
}

为实现该目标,我创建了绑定文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
        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"
        xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
        jaxb:extensionBindingPrefixes="xjc inheritance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        wsdlLocation="my_wsdl.wsdl">

    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <jaxws:bindings node="//xs:complexType[@name='someName']">
        <inheritance:implements>com.mycompany.package.Test</inheritance:implements>
    </jaxws:bindings>
</jaxws:bindings>

同时配置了Maven插件:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>${jaxws-maven-plugin.version}</version>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics</artifactId>
            <version>0.6.4</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>wsdl</id>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <xjcArgs>
                    <xjcArg>-Xinheritance</xjcArg>
                    <xjcArg>-Xequals</xjcArg>
                    <xjcArg>-XtoString</xjcArg>
                </xjcArgs>
                <genJWS>true</genJWS>
                <bindingDirectory>${basedir}/src/main/resources/soap</bindingDirectory>
                <bindingFiles>
                    <bindingFile>binding.xjb</bindingFile>
                </bindingFiles>
                <xnocompile>true</xnocompile>
                <xdebug>true</xdebug>
                <verbose>true</verbose>
                <wsdlUrls>
                    <wsdlUrl>${project.basedir}/src/main/resources/soap/my_wsdl.wsdl</wsdlUrl>
                </wsdlUrls>
                <sourceDestDir>target/generated-sources/soap</sourceDestDir>
            </configuration>
        </execution>
    </executions>
    <extensions>true</extensions>
</plugin>

其中-Xequals和-XtoString已生效,生成的类签名为:

public class SomeName implements ToString, Equals{...}

但-Xinheritance选项虽被识别(未添加jaxb2-basics依赖时会报错未知选项),却未对代码生成产生效果。绑定文件的XPath是正确的,且绑定已生效——例如将<inheritance:implements>替换为<jaxb:class name="changedName"/>时,类名会被修改,但仍不会实现所需接口。请问问题出在哪里?

问题分析与解决

1. 绑定文件的节点层级错误

当前绑定直接用jaxws:bindings定位xs:complexType,但jaxws:bindings的上下文是WSDL整体,而xs:complexType属于WSDL的wsdl:types下的XML Schema部分,正确的做法是先定位到Schema节点,再用jaxb:bindings来绑定类型:
修改绑定文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
        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"
        xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
        jaxb:extensionBindingPrefixes="inheritance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        wsdlLocation="my_wsdl.wsdl">

    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <!-- 先定位到WSDL中的Schema节点 -->
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema">
        <!-- 再绑定具体的complexType -->
        <jaxb:bindings node="//xs:complexType[@name='someName']">
            <inheritance:implements>com.mycompany.package.Test</inheritance:implements>
        </jaxb:bindings>
        <jaxb:bindings node="//xs:complexType[@name='someOtherName']">
            <inheritance:implements>com.mycompany.package.Test</inheritance:implements>
        </jaxb:bindings>
    </jaxws:bindings>
</jaxws:bindings>

注意:移除了extensionBindingPrefixes中的xjc,因为它不属于绑定前缀;同时将类型绑定放在jaxb:bindings下,确保JAXB扩展能正确识别。

2. jaxb2-basics版本过旧

你使用的0.6.4版本较老,部分兼容性可能有问题,建议升级到稳定版本(比如0.11.1),修改Maven依赖:

<dependency>
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>

3. 重新执行生成命令

确保jaxws-maven-plugin的extensions=true已开启,当前你的插件配置这部分没问题,升级依赖后执行mvn clean generate-sources即可生效。

内容的提问来源于stack exchange,提问作者Blomex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:07:50