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

Tomcat可生成WSDL但JDK wsgen无法生成含StreamingAttachment的WSDL

解决wsgen生成WSDL时@StreamingAttachment注解导致的WebServiceException问题

这问题我之前也碰到过,核心原因很明确:JDK自带的wsgen工具不支持@com.sun.xml.ws.developer.StreamingAttachment这个JAX-WS扩展注解——毕竟它是Sun/Oracle专属的扩展特性,JDK默认的wsgen并没有内置对它的解析逻辑。而Tomcat部署时你的项目肯定已经引入了JAX-WS扩展库(比如jaxws-rt),所以能正常识别这个注解并生成WSDL。

下面是具体的解决方案,一步步来:

1. 先确认项目依赖是否齐全

首先要保证你的项目里有这些关键依赖:

  • jaxws-api:JAX-WS的基础API包
  • jaxws-rt:JAX-WS的运行时实现包(专门支持StreamingAttachment这类扩展注解)
  • 如果是JDK 9及以上版本,还要额外加JAXB相关依赖(因为JAXB从JDK 9开始被移出了JDK核心):javax.xml.bind-api和jaxb-impl

用Maven的话,直接在pom.xml里加这些配置就行:

<dependencies>
    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.3.5</version>
        <scope>runtime</scope>
    </dependency>
    <!-- JDK 9+ 必须添加的JAXB依赖 -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.5</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2. 换用jaxws-rt包里的wsgen工具

别再用JDK自带的wsgen了,直接用jaxws-rt.jar里提供的wsgen——它才是专门为扩展特性设计的,这个工具的全类名是com.sun.tools.ws.wsgen。

3. 手动执行wsgen的正确命令示例

执行命令时一定要把所有依赖和项目编译类都加入classpath,不然还是会报错。举个实际例子:
假设你的项目编译后的class文件在target/classes目录,所有依赖jar都放在lib文件夹下:

# Linux/macOS系统用冒号分隔classpath
java -cp "target/classes:lib/jaxws-api.jar:lib/jaxws-rt.jar:lib/javax.xml.bind-api.jar:lib/jaxb-impl.jar" com.sun.tools.ws.wsgen -verbose -cp target/classes -wsdl com.yourcompany.server.MyWebservice

# Windows系统用分号分隔classpath
java -cp "target/classes;lib/jaxws-api.jar;lib/jaxws-rt.jar;lib/javax.xml.bind-api.jar;lib/jaxb-impl.jar" com.sun.tools.ws.wsgen -verbose -cp target/classes -wsdl com.yourcompany.server.MyWebservice

4. 检查@StreamingAttachment的参数配置

另外也可以核对一下你的注解参数:

  • dir参数如果留空,是否符合你的预期?有些环境下可能需要指定一个有效的本地目录
  • memoryThreshold的数值是不是完整的?你报错里显示的50...看起来像是没写完的样子,得确保是合法的整数

参数配置错误也可能触发这个异常,这点别忽略。

更省心的方式:用Maven插件生成

如果是Maven项目,强烈推荐用jaxws-maven-plugin插件来生成WSDL,它会自动处理依赖和classpath,不用手动敲复杂命令:

<build>
    <plugins>
        <plugin>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-maven-plugin</artifactId>
            <version>2.3.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>wsgen</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <sei>com.yourcompany.server.MyWebservice</sei>
                <verbose>true</verbose>
                <genWsdl>true</genWsdl>
            </configuration>
        </plugin>
    </plugins>
</build>

之后执行mvn jaxws:wsgen就能自动生成WSDL了,非常方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:13:10