提问者:小点点

JAX-WS用户名密码认证从Java11


我试图调用一个SOAPendpoint,它已经从一个Java11/Spring/Gradle的项目中设置了用户名/密码的基本身份验证。我设法使用wsimportJDK8类生成,并找到了几种方法,但都不起作用。

第一种方法是从这里: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

设置auth标头的第二种方法是

BindingProvider prov = (BindingProvider)tilwsPort;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pass");

我还尝试通过调用服务生成的方法来获取接口,例如:

HelloWorld hello = service.getHelloWorldPort();

有什么建议是正确的吗?谢谢!


共2个答案

匿名用户

您可以尝试通过HTTP_REQUEST_HEADERS属性设置身份验证,而不是直接在Request estContext中使用用户和密码

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检查(参见上面的注释)。