使用该 WSDL 生成客户端代码后如何摆脱 WSDL 依赖?
how to get rid of WSDL dependency after generating client code using that WSDL?
我使用 wsimport 从 WSDL 文件生成客户端代码,我已经设法测试了这个生成的代码并且它可以工作但是有一个问题,代码像这样引用 WSDL 文件,
static {
URL url = null;
try {
URL baseUrl;
baseUrl = com.spx.global.spf_wmis_dev.etq2sapintegration_zqm246f_etq_validate_matnr_webservice.matnr_provider.ETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProvider.class.getResource(".");
url = new URL(baseUrl, "file:/C:/Users/xx/Desktop/spx/wsdls/validate_MATNR.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'file:/C:/Users/xx/Desktop/spx/wsdls/validate_MATNR.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
ETQ2SAPINTEGRATIONZQM246FETQVALIDATEMATNRWEBSERVICEMATNRPROVIDER_WSDL_LOCATION = url;
}
并且我在 http://localhost:8088/validate
上使用 soapUI 运行 为该 WSDL 文件创建了一个模拟服务,如果我像这样在 WSDL 文件中使用这个 URL,一切正常很好。
<wsdl:port name="ETQ2SAPIntegration_ZQM246F_ETQ_VALIDATE_MATNR_WebService_MATNR_provider_Port" binding="tns:ETQ2SAPIntegration_ZQM246F_ETQ_VALIDATE_MATNR_WebService_MATNR_provider_Binder">
<soap:address location="http://localhost:8088/validate"/>
</wsdl:port>
现在我希望能够在不引用 WSDL 文件的情况下指定 Web 服务位置,我尝试了很多方法,例如覆盖端口 endPointAddress,
ETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProvider ser= new ETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProvider(); this class extends the Service class
javax.xml.namespace.QName qn= new QName("http://SPF-WMIS-DEV.GLOBAL.SPX.COM/ETQ2SAPIntegration.ZQM246F_ETQ_VALIDATE_MATNR.WebService:MATNR_providera", "ETQ2SAPIntegration.ZQM246F_ETQ_VALIDATE_MATNR.WebService.MATNR_provider");
ser.addPort(qn,HTTPBinding.HTTP_BINDING, "http://localhost:8088/test");
ZQM246FETQVALIDATEMATNRResponse response = new ZQM246FETQVALIDATEMATNRResponse();
MATNRProviderPortType provider = ser.getETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProviderPort();
但是无论我尝试什么,代码都一直在尝试从 WSDL 文件中读取 endPointAddress,也许我正在尝试做的事情是不可行的,这意味着我无法摆脱 WSDL 文件,我是目前还不确定,所以任何建议都会很有帮助。
P.S:不要怪我不遵守Java命名约定,我和你一样讨厌它。
您可以像这样更改请求上下文(为了更好的可读性,我缩短了服务和提供者的名称):
String address = "http://localhost:8088/validate";
BlaBlaWebService service = new BlaBlaWebService();
BlaBlaProviderPort provider = ser.getBlaBlaProviderPort();
if (provider instanceof BindingProvider) {
BindingProvider bindProvider = (BindingProvider)provider;
bindProvider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, address);
} else {
//log or fail if you want
}
我使用 wsimport 从 WSDL 文件生成客户端代码,我已经设法测试了这个生成的代码并且它可以工作但是有一个问题,代码像这样引用 WSDL 文件,
static {
URL url = null;
try {
URL baseUrl;
baseUrl = com.spx.global.spf_wmis_dev.etq2sapintegration_zqm246f_etq_validate_matnr_webservice.matnr_provider.ETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProvider.class.getResource(".");
url = new URL(baseUrl, "file:/C:/Users/xx/Desktop/spx/wsdls/validate_MATNR.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'file:/C:/Users/xx/Desktop/spx/wsdls/validate_MATNR.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
ETQ2SAPINTEGRATIONZQM246FETQVALIDATEMATNRWEBSERVICEMATNRPROVIDER_WSDL_LOCATION = url;
}
并且我在 http://localhost:8088/validate
上使用 soapUI 运行 为该 WSDL 文件创建了一个模拟服务,如果我像这样在 WSDL 文件中使用这个 URL,一切正常很好。
<wsdl:port name="ETQ2SAPIntegration_ZQM246F_ETQ_VALIDATE_MATNR_WebService_MATNR_provider_Port" binding="tns:ETQ2SAPIntegration_ZQM246F_ETQ_VALIDATE_MATNR_WebService_MATNR_provider_Binder">
<soap:address location="http://localhost:8088/validate"/>
</wsdl:port>
现在我希望能够在不引用 WSDL 文件的情况下指定 Web 服务位置,我尝试了很多方法,例如覆盖端口 endPointAddress,
ETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProvider ser= new ETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProvider(); this class extends the Service class
javax.xml.namespace.QName qn= new QName("http://SPF-WMIS-DEV.GLOBAL.SPX.COM/ETQ2SAPIntegration.ZQM246F_ETQ_VALIDATE_MATNR.WebService:MATNR_providera", "ETQ2SAPIntegration.ZQM246F_ETQ_VALIDATE_MATNR.WebService.MATNR_provider");
ser.addPort(qn,HTTPBinding.HTTP_BINDING, "http://localhost:8088/test");
ZQM246FETQVALIDATEMATNRResponse response = new ZQM246FETQVALIDATEMATNRResponse();
MATNRProviderPortType provider = ser.getETQ2SAPIntegrationZQM246FETQVALIDATEMATNRWebServiceMATNRProviderPort();
但是无论我尝试什么,代码都一直在尝试从 WSDL 文件中读取 endPointAddress,也许我正在尝试做的事情是不可行的,这意味着我无法摆脱 WSDL 文件,我是目前还不确定,所以任何建议都会很有帮助。
P.S:不要怪我不遵守Java命名约定,我和你一样讨厌它。
您可以像这样更改请求上下文(为了更好的可读性,我缩短了服务和提供者的名称):
String address = "http://localhost:8088/validate";
BlaBlaWebService service = new BlaBlaWebService();
BlaBlaProviderPort provider = ser.getBlaBlaProviderPort();
if (provider instanceof BindingProvider) {
BindingProvider bindProvider = (BindingProvider)provider;
bindProvider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, address);
} else {
//log or fail if you want
}