将数据从 SOAP 处理程序传递到 Web 服务服务器类

PC8*_*C84 5 java soap web-services jax-ws spring-boot

我有一个带有 cxf 的 Spring Boot SOAP 服务,我的消费者在 http 标头中向我传递 SSO 令牌。我能够使用 JAX-WS 处理程序检索 SSO 令牌。我正在将该 SSO 令牌保存到处理程序类级别变量中,并且在通过各种类进行控制之后,它到达了一个点,我必须向另一个服务发出请求并且必须传递相同的 SSO 令牌,但是在我的 Connection 类中,SSO令牌值为 NULL。

@Component
public class EndPointHandler implements SOAPHandler<SOAPMessageContext> {
    private List<String> ssoToken;
    private Map<String, List<String>> headers;

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean isResponse = (Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (!isResponse) {
            headers = ((Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS));
            if (headers != null) {
                if (!headers.get("SSOToken").get(0).isEmpty()) {
                    List<String> ssoToken = headers.get("SSOToken");
                    LOGGER.info(ssoToken.get(0));
                    this.ssoToken = ssoToken;
                } else {
                    LOGGER.error("SSO Token value cannot be empty");
                    return false;
                }
            }
        }
        return true;
    }

    public void setSSOToken() {
        headers.put("SSOToken", this.ssoToken);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 Connection 类中,我必须将此 SSO 令牌设置为标头并调用另一个服务,但 SSO 令牌值为 NULL。

连接类:

@Component
public class ConnectionManager {
    private static final Logger LOGGER = LoggerFactory.getLogger(ConnectionManager.class);

    @Autowired
    private EndPointHandler handler;

    private void establishConnection(String uri) throws FileNetIntegrationException {
        handler.ssoToken; //  --> I need SSO token here but the value is NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我在 WebServiceConfig 类中设置处理程序链的方式:

@Bean
public Endpoint endpoint(Bus bus) {
    EndpointImpl endpoint = new EndpointImpl(bus, changeServiceEndpoint);
    WebService ws = AnnotationUtils.findAnnotation(endpoint.getImplementorClass(), WebService.class);
    endpoint.setAddress("/" + ws.serviceName());
    endpoint.publish();
    SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
    ArrayList<Handler> handlerChain = new ArrayList<>();
    handlerChain.add(new EndPointHandler());
    binding.setHandlerChain(handlerChain);
    return endpoint;
}
Run Code Online (Sandbox Code Playgroud)

PC8*_*C84 4

我想,当我注意到我在将其添加到处理程序链时使用了 new EndPointHandler() 时,我在此处发布最后一段代码后立即得到了一个解决方案。我尝试使用 Autowired 它,它对我有用。