我正在使用wsdl2java生成的类和这段代码:
MyService f = new MyService();
MyServicePortType type = f.getMyServicePortType();
每次通话最多需要30秒。那是为什么?
答案 0 :(得分:5)
经过数小时的谷歌搜索和修补,问题在于如何引用方案文件: 虽然WSDL和XSD是在本地存储的,但仍有一些参考w3.org,如下所示:
<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd" [...
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd" />
w3.org服务器超级缓慢,因此我的客户端启动缓慢。
我已将对本地的引用更改为:
<import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd" />
答案 1 :(得分:0)
自从我努力奋斗了好几天以来,我欠你很多债,而你的回答为我指明了正确的方向。
实际上,w3.org URL会花很多时间来响应,但是实际上没有理由为什么从WSDL生成的SOAP客户端仍然需要在运行时解析WSDL。
实际上并非如此,但是默认生成的约束者会强制这样做。
我发现可以通过以其他方式实例化服务端口并通过请求上下文指定服务端点来跳过此操作,如下所示:
// creating the service this way passes null as the wsdlLocation, preventing the runtime resolution and parsing of the wsdl
Service service = ZefixService.create(ZefixService.SERVICE);
ZefixServicePortType zefixServicePort = service.getPort(ZefixServicePortType.class);
Map<String, Object> requestContext = ((BindingProvider) zefixServicePort).getRequestContext();
// because we create the service without the wsdl location, we need to specify the service base url ourselves
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, Configuration.get(Constants.API_BASE_URI_PROPERTY));
requestContext.put(BindingProvider.USERNAME_PROPERTY, Configuration.get(Constants.USER_PROPERTY));
requestContext.put(BindingProvider.PASSWORD_PROPERTY, Configuration.get(Constants.PASSWORD_PROPERTY));
return zefixServicePort;
希望以后对您和其他人有用。
再次感谢