如何在wsimport运行时替换WSDL中xsd:import路径的反斜杠为正斜杠?
解决JDK 1.8 wsimport解析WSDL时反斜杠路径错误的方案
问题根源
WSDL中xsd:import标签的schemaLocation使用了Windows风格的反斜杠(\),而wsimport遵循URL路径规范,仅识别正斜杠(/),触发Illegal character in path错误。
无需手动修改文件的解决方案
1. 用-catalog参数配合XML目录文件
创建XML目录文件(例如catalog.xml),通过路径重写自动替换反斜杠:
<?xml version="1.0" encoding="UTF-8"?> <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <!-- 单个文件映射 --> <rewriteURI uriStartString="....\schema\abcdschema.xsd" rewritePrefix="..../schema/abcdschema.xsd"/> <!-- 批量匹配schema目录下的所有文件 --> <rewriteURI uriStartString="....\schema\" rewritePrefix="..../schema/"/> </catalog>
在NetBeans中配置:右键项目 → 属性 → Web服务 → 客户端,在「附加wsimport选项」中填入-catalog catalog.xml(确保catalog.xml放在项目根目录,或指定完整路径)。
2. 自定义URLStreamHandler(进阶批量处理)
编写自定义Handler自动转换路径中的反斜杠:
import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; public class BackslashFixHandler extends URLStreamHandler { @Override protected URLConnection openConnection(URL url) throws IOException { String fixedPath = url.getPath().replace("\\", "/"); URL correctedUrl = new URL(url.getProtocol(), url.getHost(), url.getPort(), fixedPath); return correctedUrl.openConnection(); } }
编译后,在NetBeans中给wsimport添加VM参数:-Djava.protocol.handler.pkgs=你的类所在包名,比如类在com.example.handlers下,参数就是-Djava.protocol.handler.pkgs=com.example.handlers。配置路径:项目属性 → 运行 → VM选项,或在Web服务客户端的附加wsimport选项中加入该参数。
3. Maven项目用jaxws-maven-plugin配置
如果项目基于Maven,直接在pom.xml中配置插件并指定catalog文件:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>2.6</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> </execution> </executions> <configuration> <wsdlUrls> <wsdlUrl>你的WSDL地址/路径</wsdlUrl> </wsdlUrls> <catalog>catalog.xml</catalog> </configuration> </plugin>
NetBeans会自动识别Maven配置,执行wsimport时自动应用路径转换。
注意点
- 目录文件的
uriStartString要精准匹配WSDL中schemaLocation的前缀,确保覆盖所有带反斜杠的引用路径。 - 自定义Handler需确保类已加入项目类路径,NetBeans中可将编译后的class文件放在
src/main/resources或指定类路径目录。
内容的提问来源于stack exchange,提问作者vvv99
相关产品推荐
相关产品推荐

