项目场景:
wsimport命令生成webService客户端代码中的ip地址配置文件自定义配置
问题描述:
wsimport命令生成webService客户端代码中的ip地址是写死的,如果有正式环境和测试环境,就需要手动在代码中修改,并且地址的加载也是在静态块中家中,导致常规的的那种配置文件读取方式就无法实现,如果一定要配置,该如何实现呢?
wsimport命令生成webService客户端代码如下,webservice的地址(ip)是固定的,暂时就不方便动态改变测试地址。

解决方案:
具体实现在配置文件配置webservice地址,根据测试环境直接在配置文件修改地址即可,无需改代码再打jar包。(两种读取方式,.yml与.properties稍有差别)
1、.yml文件的读取方式(附上个人的配置文件格式)

application.yml(主入口)
spring:
profiles:
active: prod
application-dev.yml(测试)
server:
port: 8080
webservices:
URL: http://192.168.0.62:8085/BespokeWebService.asmx?wsdl
application-prod.yml(正式)
server:
port: 8081
webservices:
URL: http://192.168.0.62:8082/BespokeWebService.asmx?wsdl
配置方式
原地址代码块(包含static部分)

修改后的配置方式(主要是static静态代码块)

类方法注解代码:
@WebServiceClient(name = "BespokeWebService", targetNamespace = "http://tempuri.org/", wsdlLocation = "${WSDLURL}")
类里面的static配置
static {
URL url = null;
WebServiceException e = null;
Properties prop = new Properties();
// 读取主文件
InputStream in = Object.class.getResourceAsStream("/application.yml");
InputStream in2 = null;
try {
prop.load(in);
// 根据主配置判断是进入正式还是测试配置中读取地址
String trim = prop.getProperty("active").trim();
// 判断是正式或测试配置文件(prod)配置文件名中的prod或dev一致
if (("prod").equals(trim)) {
in2 = Object.class.getResourceAsStream("/application-prod.yml");
} else {
in2 = Object.class.getResourceAsStream("/application-dev.yml");
}
Properties prop2 = new Properties();
prop2.load(in2);
// 获取配置文件的webservice地址
WSDLURL = prop2.getProperty("URL").trim();
url = new URL(WSDLURL);
// 流关闭
in.close();
in2.close();
} catch (Exception ex) {
try {
in.close();
in2.close();
} catch (IOException exc) {
exc.printStackTrace();
}
e = new WebServiceException(ex);
}
// 这里是你自己代码生成的部分
BESPOKEWEBSERVICE_WSDL_LOCATION = url;
BESPOKEWEBSERVICE_EXCEPTION = e;
}
2、.properties文件的读取方式(附上个人的配置文件格式)

application.properties(主入口)
spring.profiles.active=prod
application-prod.properties
server.port=8080
webservices.URL=http://192.168.0.62:8082/BespokeWebService.asmx?wsdl
application-dev.properties
server.port=8081
webservices.URL=http://192.168.0.62:8085/BespokeWebService.asmx?wsdl
原配置和.yml方式一样,故只付上static的代码段,以作区别
static {
URL url = null;
WebServiceException e = null;
Properties prop = new Properties();
// 读取主文件
InputStream in = Object.class.getResourceAsStream("/application.properties");
InputStream in2 = null;
try {
prop.load(in);
// 根据主配置判断是进入正式还是测试配置中读取地址
String trim = prop.getProperty("spring.profiles.active").trim();
// 判断是正式或测试配置文件(prod)配置文件名中的prod或dev一致
if (("prod").equals(trim)) {
in2 = Object.class.getResourceAsStream("/application-prod.properties");
} else {
in2 = Object.class.getResourceAsStream("/application-dev.properties");
}
Properties prop2 = new Properties();
prop2.load(in2);
// 获取配置文件的webservice地址
WSDLURL = prop2.getProperty("webservices.URL").trim();
url = new URL(WSDLURL);
// 流关闭
in.close();
in2.close();
} catch (Exception ex) {
try {
in.close();
in2.close();
} catch (IOException exc) {
exc.printStackTrace();
}
e = new WebServiceException(ex);
}
// 这里是你自己代码生成的部分
BESPOKEWEBSERVICE_WSDL_LOCATION = url;
BESPOKEWEBSERVICE_EXCEPTION = e;
}
总结:
由于地址在静态块里面,所以平常的注解方式(@Value("${server.port}") public String port;)就无法实现,于是自己经过借鉴与多次尝试,总结得到以上方式,可能代码存在些许不足之处,望各位多多包涵,如有可优化之处,还请交流学习,谢谢。
本文介绍了在使用wsimport命令生成webService客户端时遇到的IP地址写死问题。通过配置文件(.yml和.properties)来动态设置地址,避免了在不同环境间手动修改代码。文中提供了配置文件的示例和代码实现,使得在测试和正式环境中可以灵活切换webservice地址。

1923

被折叠的 条评论
为什么被折叠?



