我正在使用 mule <cxf:proxy-service>
,需要提取 Web 服务方法名称以附加到消息以供以后使用。
我们有一个实现 Callable 接口的服务代理类。最初我们尝试获取这样的操作名称:
public Object onCall(MuleEventContext eventContext) throws Exception {
try {
MuleMessage inboundMessage = eventContext.getMessage();
Set<String> props = inboundMessage.getInvocationPropertyNames();
System.out.println("CXF invocation properties ==> " + props);
System.out.println("CXF invocation property ==> " + inboundMessage.getInvocationProperty("cxf_operation"));
但上面的代码给出了不正确的操作名称。(我们有 4 个操作在服务中,它总是给出第二个操作名称)。以下是用于此的 mule 流程:
<flow name="proxyService">
<http:inbound-endpoint address="${some.address}"
exchange-pattern="request-response">
<cxf:proxy-service wsdlLocation="classpath:abc.wsdl"
namespace="http://namespace"
service="MyService">
</cxf:proxy-service>
</http:inbound-endpoint>
<component class="com.services.MyServiceProxy" />
所以,我写了一个入站 cxf 拦截器来提取操作名称。我在下面写了拦截器,它适用于元素,<cxf:jaxws-service>
但不适用于<cxf:proxy-service>
元素。
这是我的拦截器:
public class GetCXFOperation extends AbstractPhaseInterceptor<Message> {
public GetCXFOperation() {
super(Phase.PRE_INVOKE);
}
@Override
public void handleMessage(Message message) throws Fault {
Exchange exchange = message.getExchange();
Endpoint ep = exchange.get(Endpoint.class);
OperationInfo op = exchange.get(OperationInfo.class);
if(op != null){
System.out.println("Operation Name: " + op.getName().getLocalPart());
} else{
Object nameProperty = exchange.get("org.apache.cxf.resource.operation.name");
if(nameProperty != null)
System.out.println(nameProperty.toString());
}
}
}
寻求指导如何提取操作名称<cxf:proxy-service>
?有没有一种简单的骡子方法可以得到正确答案?还是有一个不同的阶段我应该调用我的拦截器?哪些阶段适用<cxf:proxy-service>