来自Java 11和Gradle的JAX-WS username-password authentification



我正在尝试调用一个SOAP端点,它已经从Java 11/Spring/Gradle项目中设置了一个基本的用户名/密码认证。我设法使用JDK 8用wimport生成这些类,并找到了几种方法,但都不起作用。

第一种方法来自这里:https://mkyong.com/webservices/jax-ws/application-authentication-with-jax-ws/但我得到一个java.lang.IllegalArgumentException: *端口引用的方法是不可见的,从类加载器当我尝试

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);

我的情况是一个复杂的解决方案:

  1. 必须为Spring Dev-tools创建一个.properties文件(见上面的注释),以便生成的文件被忽略。
  2. 使用BindingProvider的解决方案设置认证。
  3. 禁用本地测试的SSL检查(请参阅上面的注释)。

最新更新