因此,经过大量调查,我终于弄清楚了问题所在。这一切都归结为从http重定向到https。从我在网上找到的文章(不再记得网址)中,由于安全原因,wsdl2java和wsimport存根生成器用于进行 Web 服务通信的库不允许遵循 http 到 https 的重定向。
因此,即使我是从 https wsdl 位置生成存根,即。https://wsdl.location.com?wsdl,当我运行代码进行网络服务调用时,它试图调用http://wsdl.location.com导致重定向请求到https:/ /wsdl.location.com,但 http 库不允许这样做。所以它只是将 302 http 代码作为异常转发。
此外,还有两个 Web 服务 URL。一个是测试服务,它是普通的 http url,然后是一个通过 https 的生产服务器。因此,要解决这个问题,我所做的就是通过使用BindingProvider类动态配置服务以使用我指定的端点(现在是 https 地址)。这也允许我根据要调用的环境动态指定使用测试 URL 或生产 URL。
NotificationWebService service = new NotificationWebService();
NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap();
BindingProvider bindingProvider = (BindingProvider) serviceSoap;
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://wsdl.location.com");
String xmlString = serviceSoap.getRSAPublicKeyXMLString();
所以简而言之,如果有人遇到这个问题。确保您需要指向的端点是否在 https 上,即您正在进行直接 https 调用,而不是会要求 https 重定向的 http 调用。您可以通过在调试时检查serviceSoap来检查这一点。它会说它正在拨打哪个网址。
我没有考虑或选择配置wsdl2java和wsimport以生成存根并强制存根使用 https 调用的选项,以便我可以为不同的环境配置多个 url 端点。