Java 17下无法从WSDL生成存根及证书导入失败求助
Java 17下WSDL存根生成及证书导入失败求助
问题描述
- 此前使用JDK 5时,无需插件就能在Eclipse中通过wsimport从WSDL生成存根,证书导入流程简单。
- 当前使用Java 17,目标WSDL URL为非公开地址,已安装对应证书且浏览器可正常访问API,但通过SOAP UI、Apache CXF、wsimport生成存根均失败。
- 重点尝试wsimport时控制台报错,按网上方案执行以下keytool命令导入证书也报错:
keytool -importcert -trustcacerts -alias superadmin -file C:\Program Files\Java\jdk-17\lib\security\superadmin.cer -keystore “C:\Program Files\Java\jdk-17\lib\security\cacerts” -storepass changeit
解决建议
1. 修正keytool命令语法
命令中使用了中文全角引号(“”),Java工具无法识别,需替换为英文半角引号;同时确保以管理员权限运行命令提示符(避免文件权限不足),修正后的命令:
keytool -importcert -trustcacerts -alias superadmin -file "C:\Program Files\Java\jdk-17\lib\security\superadmin.cer" -keystore "C:\Program Files\Java\jdk-17\lib\security\cacerts" -storepass changeit
2. 验证证书导入结果
导入完成后,用以下命令确认证书是否成功加入信任库:
keytool -list -alias superadmin -keystore "C:\Program Files\Java\jdk-17\lib\security\cacerts" -storepass changeit
若证书不存在,检查证书文件路径是否正确,确保superadmin.cer是从目标WSDL站点导出的有效根证书或中间证书。
3. 为wsimport指定信任库
Java 17的wsimport可能未默认使用JDK的cacerts,执行时显式指定信任库路径:
wsimport -truststore "C:\Program Files\Java\jdk-17\lib\security\cacerts" -storepass changeit https://你的私有WSDL地址
注意:若WSDL引用了其他XSD文件,需确保这些XSD所在站点的证书也已导入信任库。
4. Apache CXF wsdl2java配置方案
创建CXF配置文件cxf.xml,指定信任库信息:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="tlsClientParams" class="org.apache.cxf.configuration.jsse.TLSClientParameters"> <property name="trustManagers"> <bean class="org.apache.cxf.configuration.jsse.TrustManagerFactoryBean"> <property name="keyStoreType" value="JKS"/> <property name="keyStoreLocation" value="file:C:/Program Files/Java/jdk-17/lib/security/cacerts"/> <property name="keyStorePassword" value="changeit"/> </bean> </property> </bean> <bean id="httpConduitConfigurer" class="org.apache.cxf.transport.http.HTTPConduitConfigurer"> <method name="configure"> <parameter type="org.apache.cxf.endpoint.Endpoint"/> <parameter type="org.apache.cxf.transport.http.HTTPConduit"/> </method> <property name="tlsClientParameters" ref="tlsClientParams"/> </bean> </beans>
执行wsdl2java时指定配置文件:
wsdl2java -c cxf.xml https://你的私有WSDL地址
内容的提问来源于stack exchange,提问作者suri
相关产品推荐
相关产品推荐

