目前我正在解决以下问题:
在特殊情况下,我需要将SOAP请求转发到外部服务(基于SOAP消息中提供的tenantId
做出决定)。我为此任务创建了一个拦截器,用于从消息请求中提取tenantId
,获得赋值(每个tenantId
被分配给在不同服务器上运行的自己的服务实例),如果没有赋值,我需要正常处理请求。
目前我以这种方式实现:我在拦截器中创建HttpUrlConnection
并将请求转发到外部端点(如果有分配)并获取响应的outputStream
并发送响应HttpServletResponse.getOutputStream
等...
我还需要考虑拦截器与各种服务一起使用(必须在SOAP请求中提供tenantId
)。
我还读到了关于Provider和Dispatch对象的信息,不知道这应该如何工作。
有没有办法从传入消息中获取目标服务和端口(QNames)?
我目前无法使用Camel(仅允许使用CXF)。
答案 0 :(得分:1)
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.