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
相关产品推荐
相关产品推荐

