2016-04-24 2 views
1

В настоящее время я борюсь со следующей проблемой:переадресация запросы к внешней конечной точке от службы CFX

мне нужно пересылать запросы SOAP к внешней службе в особых случаях (решения на основе tenantId, представленные в сообщении SOAP). Я создал перехватчик для этой задачи, чтобы извлечь tenantId из запроса сообщения, получить назначение (каждый tenantId присваивается собственному экземпляру службы, запущенному на другом сервере), и если никакого назначения не было сделано, мне нужно обработать запрос так же, как обычно.

В настоящее время я реализовал на этом пути: создать HttpUrlConnection в перехватчике и направить запрос на внешнюю конечную точку (в случае, если есть присвоение) и принять outputStream ответ и отправить ответ по HttpServletResponse.getOutputStream ... и т.д.

Мне также необходимо учитывать, что перехватчик должен использоваться с различным сервисом (tenantId должен быть предоставлен в запросе SOAP).

Я также читал об объектах Провайдера и Отправления, которые не знают, как это должно работать.

Есть ли способ получить целевое обслуживание и порт (QNames) из входящего сообщения?

Я не могу использовать Camel в данный момент (допускается только CXF).

ответ

0

Может быть, вы можете попробовать что-то вроде этого:

/** 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)); 
    } 
} 

Надежда эта помощь.

Смежные вопросы