JAX-WS SoapHandler не вызывается при использовании среды выполнения CXF - PullRequest
0 голосов
/ 22 апреля 2020

Я реализовал клиентскую библиотеку, которая использует jax-ws для связи с серверной частью. Я не контролирую время выполнения jax-ws: мой клиент может выбрать, какой из них он хотел бы использовать. Моя реализация включает в себя SoapHandler для обработки аутентификации путем вставки учетных данных в заголовок SOAP перед отправкой сообщения. Я установил этот обработчик программно, используя javax. xml .ws.Binding.setHandlerChain ().

Binding binding = ((BindingProvider)jobMgmtSvc).getBinding();
List<Handler> handlerList = binding.getHandlerChain();
handlerList.add(new EctsSoapHandler(new MyTokenProvider(authUrl, user, pwd)));
binding.setHandlerChain(handlerList);

Все работает нормально, когда я использую среду выполнения jax-ws Oracle JRE 1.8. Но когда я использую среду выполнения CXF (версия 3.2.8), мой обработчик не вызывается. Любые идеи, почему?

Отредактировано: после дополнительных проблем, кажется, моя проблема в том, что среда выполнения CXF пытается получить токен безопасности самостоятельно через STSClient:

    2020-04-27 09:44:59,099  WARN [main] org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {http://tempuri.org/}JobManagement#{http://adlibsoftware.com/}GetJobsStatus has thrown exception, unwinding now
    org.apache.cxf.ws.security.trust.TrustException: The STSClient is not configured with either a location or wsdlLocation property
    at org.apache.cxf.ws.security.trust.AbstractSTSClient.createClient(AbstractSTSClient.java:680)
    at org.apache.cxf.ws.security.trust.AbstractSTSClient.issue(AbstractSTSClient.java:754)
    at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:61)
    at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:55)
    at org.apache.cxf.ws.security.trust.STSClient.requestSecurityToken(STSClient.java:51)
    at org.apache.cxf.ws.security.trust.STSTokenRetriever.getTokenFromSTS(STSTokenRetriever.java:262)
    at org.apache.cxf.ws.security.trust.STSTokenRetriever.getToken(STSTokenRetriever.java:110)
    at org.apache.cxf.ws.security.policy.interceptors.IssuedTokenInterceptorProvider$IssuedTokenOutInterceptor.handleMessage(IssuedTokenInterceptorProvider.java:144)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:440)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)

Я уже реализовал SOAPHandler для получения токена, так как я могу отключить STS и заставить CXF использовать мою реализацию SOAPHandler? Опять же, я хотел бы, чтобы мой код работал с любой средой выполнения jax-ws, поэтому я не хочу, чтобы в моем коде были какие-либо зависимости CXF.

Любая помощь будет принята с благодарностью.

...