纯java jdk 开发soap webservice客户端及BaiscAuth用户名密码回填使用BindingProvider

最近开发一个soap webservice 客户端代码

使用jdk1.8自带工具命令 wsimport 

cmd命令行> wsimport -keep (持久化)  -p(package) com.test.webservice.case1 -s (src目录) ./src -verbose (命令行打印细节)http://basicusername:password@test.webservice地址.cn:8080/test?wsdl (soap地址)


然后会生成代码到指定目录:
然后就是测试,测试时发现basicauth的账号密码在url里拼接会报401错误。估计是url各种转换不支持在url里。
最后根据网上查找的资料:
第一种方法:设置全局缺省账号密码。这种可以倒是可以,但是该url的鉴权变成全局的通用账号密码,有点范围扩大。 继续找资料找到第二种方法:
        Authenticator myAuth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(
                        "someuser",
                        "somepassword".toCharArray());
            }

            @Override
            protected URL getRequestingURL() {
                return super.getRequestingURL();
            }

            @Override
            protected RequestorType getRequestorType() {
                return super.getRequestorType();
            }
        };
        Authenticator.setDefault(myAuth);

第二种方法:强制转换(BindingProvider ),然后设置参数。生成的代码是注解形式的,估计再jdk源码里,

最终的注解代理生成的实现类实现了该接口。所以才能使用吧?囧~


TestService factory = new TestService(url);
Service2750 soap = factory.getHTTPPort();
BindingProvider bp = (BindingProvider) soap;
BindingProvider bp = (BindingProvider) soap;
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,"someuser");
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "somepassword");

soap.callSometh();
posted @ 2022-04-07 09:05  断舍离-重学JAVA之路  阅读(695)  评论(0编辑  收藏  举报