使用JAXB的xjc工具生成Java类时遇HTTP 401认证问题求助
解决XJC访问带基础认证的WSDL时的HTTP 401问题
这个场景我之前处理过,给你几个靠谱的解决方案,结合你已经配置的代理参数来调整:
方法1:先手动下载WSDL到本地(最稳妥)
xjc本身对带基础认证的WSDL支持不算直接,先把WSDL下载到本地再处理会更省心。你可以用curl或者wget工具,同时带上Web服务的基础认证和代理信息:
用curl下载的命令:
curl -u *your-ws-username*:*your-ws-password* -x http://*myusername*:*password*@*proxyserver*:*proxyport* https://www.example.com/ws/service?wsdl -o service.wsdl
-u后面跟着Web服务要求的基础认证用户名和密码(不是代理的账号)-x是你的代理配置,和你之前用的-httpproxy参数对应,替换成实际的代理信息-o指定保存到本地的文件名,方便后续调用xjc
下载完成后,直接用xjc处理本地文件:
xjc -d src service.wsdl -wsdl -verbose
如果你的WSDL里还引用了其他关联的XSD或WSDL文件,可能需要把这些也一并下载到本地,然后修改service.wsdl里的引用路径为本地路径,再执行xjc命令。
方法2:给XJC传递JVM参数实现基础认证
xjc是Java编写的工具,可以通过-J前缀传递JVM系统属性,来设置HTTP基础认证信息,结合你的代理参数一起使用:
xjc -d src https://www.example.com/ws/service?wsdl -wsdl -verbose \ -httpproxy *myusername*:*password*@*proxyserver*:*proxyport* \ -J-Dhttp.auth.preemptive=true \ -J-Dhttp.username=*your-ws-username* \ -J-Dhttp.password=*your-ws-password*
-J-Dhttp.auth.preemptive=true:让HTTP请求提前发送认证信息,避免先收到401再重试,提升成功率-J-Dhttp.username和-J-Dhttp.password:替换成Web服务要求的基础认证账号密码
如果你的Web服务用的是HTTPS,且需要自定义证书信任库,还可以添加-J-Djavax.net.ssl.trustStore=*your-truststore-path*,不过大部分公共服务不需要这一步。
方法3:用Maven插件自动化处理(适合项目集成)
如果你的项目用Maven管理,推荐用jaxb2-maven-plugin来生成Java类,它能更灵活地配置认证和代理,适合长期维护的项目:
在你的pom.xml里添加插件配置:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <wsdlUrls> <wsdlUrl>https://www.example.com/ws/service?wsdl</wsdlUrl> </wsdlUrls> <outputDirectory>src/main/java</outputDirectory> <!-- 配置Web服务基础认证 --> <httpBasicAuth> <username>*your-ws-username*</username> <password>*your-ws-password*</password> </httpBasicAuth> <!-- 配置代理 --> <proxy> <host>*proxyserver*</host> <port>*proxyport*</port> <username>*myusername*</username> <password>*password*</password> </proxy> </configuration> </plugin>
然后执行mvn jaxb2:xjc就能自动生成Java类了,不用每次手动拼接复杂的命令。
内容的提问来源于stack exchange,提问作者Sahin Yanlık
相关产品推荐
相关产品推荐

