Errno
Errno

Reputation: 111

Forwarding requests to external endpoint from an CFX service

Currently I am fighting with the following problem:

I need to forward SOAP requests to an external service in special cases (decision based on tenantId provided in the SOAP message). I created an interceptor for this task to extract tenantId from the message request, get assignment (each tenantId is assigned to its own service instance running on a different server) and if no assignment is made, I need to process the request just as normal.

Currently I implemented on this way: I create HttpUrlConnection in the interceptor and forward the request to an external endpoint (in case there is an assignment) and take the outputStream of the response and send the response over HttpServletResponse.getOutputStream etc...

I also need to consider that the interceptor be used with various service (tenantId must be provided in the SOAP request).

I also read about Provider and Dispatch objects not sure how this should work.

Is there any way to get target service and port (QNames) from the incoming message?

I cannot use Camel at the moment (only CXF is allowed).

Upvotes: 2

Views: 546

Answers (1)

Thomas
Thomas

Reputation: 1140

Maybe you can try something like this :

/** Your interceptor */
public void handleMessage(SoapMessage msg) throws Fault {

    Exchange exchange = msg.getExchange();
    Endpoint ep = exchange.get(Endpoint.class);

    // Get the service name
    ServiceInfo si = ep.getEndpointInfo().getService();
    String serviceName = si.getName().getLocalPart();

    XMLStreamReader xr = msg.getContent(XMLStreamReader.class);
    if (xr != null) { // If we are not even able to parse the message in the SAAJInInterceptor (CXF internal interceptor) this can be null

        // You have the QName
        QName name = xr.getName();

        SOAPMessage msgSOAP = msg.getContent(SOAPMessage.class);

        // Read soap msg
        if (msgSOAP != null) {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            msgSOAP.writeTo(byteArrayOutputStream);
            String encoding = (String) msg.get(Message.ENCODING);
            String xmlRequest = new String(byteArrayOutputStream.toByteArray(), encoding);
        }

        // Forward to external service with JAX-RS implementation
        Client client = ClientBuilder.newClient()
                .target("http://your-target")
                .path("/custom-path")
                .request()
                .post(Entity.entity(xmlRequest, MediaType.APPLICATION_XML));
    }
}

Hope this help.

Upvotes: 1

Related Questions