wsimport命令生成webService客户端中动态配置webservice地址

本文介绍了在使用wsimport命令生成webService客户端时遇到的IP地址写死问题。通过配置文件(.yml和.properties)来动态设置地址,避免了在不同环境间手动修改代码。文中提供了配置文件的示例和代码实现,使得在测试和正式环境中可以灵活切换webservice地址。

项目场景:

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;)就无法实现,于是自己经过借鉴与多次尝试,总结得到以上方式,可能代码存在些许不足之处,望各位多多包涵,如有可优化之处,还请交流学习,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值