如何解决来自 Java 11 和 Gradle 的 JAX-WS 用户名密码验证
我正在尝试调用一个 SOAP 端点,该端点已使用 Java 11/Spring/Gradle 的项目中的用户名/密码设置了基本身份验证。 我设法使用 JDK 8 使用 wsimport 生成了这些类,并找到了几种方法,但它们都不起作用。
第一种方法来自这里:https://mkyong.com/webservices/jax-ws/application-authentication-with-jax-ws/ 但我得到一个 java.lang.IllegalArgumentException: *Port 引用的方法在我尝试时从类加载器不可见
Service service = Service.create(url,qname);
HelloWorld hello = service.getPort(HelloWorld.class);
我尝试了 Service 类和 HelloWorld 类是由 wsimport 生成或由我编写的类,就像在这个例子中所做的那样:https://www.baeldung.com/spring-soap-web-service#1-generate-client-code
设置身份验证标头的第二种方法是使用
BindingProvider prov = (BindingProvider)tilwsPort;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY,"username");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,"pass");
我也尝试通过调用服务的生成方法来获取接口,例如:
HelloWorld hello = service.getHelloWorldPort();
有什么建议应该是正确的方法?谢谢!
解决方法
您可以尝试通过 HTTP_REQUEST_HEADERS 属性设置身份验证,而不是直接在 RequestContext 中使用用户和密码。在您提供的第一个链接中,您有示例
Map<String,Object> req_ctx = ((BindingProvider)hello).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,WS_URL);
Map<String,List<String>> headers = new HashMap<String,List<String>>();
headers.put("Username",Collections.singletonList("mkyong"));
headers.put("Password",Collections.singletonList("password"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS,headers);
,
就我而言,解决方案很复杂:
- 必须为 Spring Dev-tools 创建一个 .properties 文件(请参阅上面的评论),以便忽略生成的文件。
- 使用带有 BindingProvider 的解决方案设置身份验证。
- 禁用本地测试的 SSL 检查(请参阅上面的评论)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。