You can implement your own customer message header filters by implementing the
MessageHeaderFilter Java interface. You must associate a filter with one or
more XML schema namespaces (representing the header's namespace) and it is possible to
differentiate between request message headers and response message headers.
The MessageHeaderFilter interface is defined in the
org.apache.camel.component.cxf.common.header package, as follows:
// Java
package org.apache.camel.component.cxf.common.header;
import java.util.List;
import org.apache.camel.spi.HeaderFilterStrategy.Direction;
import org.apache.cxf.headers.Header;
public interface MessageHeaderFilter {
List<String> getActivationNamespaces();
void filter(Direction direction, List<Header> headers);
}The MessageHeaderFilter.filter() method is reponsible for applying header
filtering. Filtering is applied both before and after an operation is invoked on an
endpoint. Hence, there are two directions to which filtering is applied, as follows:
Direction.OUTWhen the
directionparameter equalsDirection.OUT, the filter is being applied to a request either leaving a consumer endpoint or entering a producer endpoint (that is, it applies to a WS request message propagating through a route).Direction.INWhen the
directionparameter equalsDirection.IN, the filter is being applied to a response either leaving a producer endpoint or entering a consumer endpoint (that is, it applies to a WS response message being sent back).
Filtering can be applied by removing elements from the list of headers,
headers. Any headers left in the list are propagated.
It is possible to register multiple header filters against a given CXF endpoint. The CXF endpoint selects the appropriate filter to use based on the XML namespace of the WSDL binding protocol (for example, the namespace for the SOAP 1.1 binding or for the SOAP 1.2 binding). If a header's namespace is unknown, the header is propagated by default.
To bind a filter to one or more namespaces, implement the
getActivationNamespaces() method, which returns the list of bound XML
namespaces.
Example 1 illustrates how to identify the namespaces to which you can bind a filter. This example shows the WSDL file for a Bank server that exposes SOAP endpoints.
Example 1. Sample Binding Namespaces
<wsdl:definitions targetNamespace="http://cxf.apache.org/schemas/cxf/idl/bank"
xmlns:tns="http://cxf.apache.org/schemas/cxf/idl/bank"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
...
<wsdl:binding name="BankSOAPBinding" type="tns:Bank">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getAccount">
...
</wsdl:operation>
...
</wsdl:binding>
...
</wsdl>From the soap:binding tag, you can infer that namespace associated with the
SOAP binding is http://schemas.xmlsoap.org/wsdl/soap/.
If you want to implement your own custom filter, define a class that inherits from the
MessageHeaderFilter interface and implement its methods as described in this
section. For example, Example 2 shows an example of a custom
filter, CustomHeaderFilter, that binds to the namespace,
http://cxf.apache.org/bindings/custom, and relays all of the headers that
pass through it.
Example 2. Sample Header Filter Implementation
// Java
package org.apache.camel.component.cxf.soap.headers;
import java.util.Arrays;
import java.util.List;
import org.apache.camel.component.cxf.common.header.MessageHeaderFilter;
import org.apache.camel.spi.HeaderFilterStrategy.Direction;
import org.apache.cxf.headers.Header;
public class CustomHeaderFilter implements MessageHeaderFilter {
public static final String ACTIVATION_NAMESPACE = "http://cxf.apache.org/bindings/custom";
public static final List<String> ACTIVATION_NAMESPACES = Arrays.asList(ACTIVATION_NAMESPACE);
public List<String> getActivationNamespaces() {
return ACTIVATION_NAMESPACES;
}
public void filter(Direction direction, List<Header> headers) {
}
}







