In normal message processing, an interceptor's handleMessage()
method is invoked. It receives
that message data as a Message
object. Along with the actual contents of the message, the
Message
object may contain a number of properties related to the message or the
message processing state. The exact contents of the Message
object depends on the
interceptors preceding the current interceptor in the chain.
The Message
interface provides two methods that can be used in extracting the message
contents:
public <T> T getContent(java.lang.Class<T> format);
The
getContent()
method returns the content of the message in an object of the specified class. If the contents are not available as an instance of the specified class, null is returned. The list of available content types is determined by the interceptor's location on the interceptor chain and the direction of the interceptor chain.public Collection<Attachment> getAttachments();
The
getAttachments()
method returns a JavaCollection
object containing any binary attachments associated with the message. The attachments are stored inorg.apache.cxf.message.Attachment
objects.Attachment
objects provide methods for managing the binary data.Important Attachments are only available after the attachment processing interceptors have executed.
The direction of a message can be determined by querying the message exchange. The message exchange stores the inbound message and the outbound message in separate properties.[1]
The message exchange associated with a message is retrieved using the message's getExchange()
method. As shown in Example 4.1, getExchange()
does not take
any parameters and returns the message exchange as a org.apache.cxf.message.Exchange
object.
The Exchange
object has four methods, shown in Example 4.2,
for getting the messages associated with an exchange. Each method will either return the message as a
org.apache.cxf.Message
object or it will return null if the message does not exist.
Example 4.2. Getting messages from a message exchange
Message getInMessage();
Message getInFaultMessage();
Message getOutMessage();
Message getOutFaultMessage();
Example 4.3 shows code for determining if the current message is outbound. The method gets the message exchange and checks to see if the current message is the same as the exchange's outbound message. It also checks the current message against the exchanges outbound fault message to error messages on the outbound fault interceptor chain.
Example 4.3. Checking the direction of a message chain
public static boolean isOutbound() { Exchange exchange = message.getExchange(); return message != null && exchange != null && (message == exchange.getOutMessage() || message == exchange.getOutFaultMessage()); }
Example 4.4 shows code for an interceptor that processes zip compressed messages. It checks the direction of the message and then performs the appropriate actions.
Example 4.4. Example message processing method
import java.io.IOException; import java.io.InputStream; import java.util.zip.GZIPInputStream; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; public class StreamInterceptor extends AbstractPhaseInterceptor<Message> { ... public void handleMessage(Message message) { boolean isOutbound = false; isOutbound = message == message.getExchange().getOutMessage() || message == message.getExchange().getOutFaultMessage(); if (!isOutbound) { try { InputStream is = message.getContent(InputStream.class); GZIPInputStream zipInput = new GZIPInputStream(is); message.setContent(InputStream.class, zipInput); } catch (IOException ioe) { ioe.printStackTrace(); } } else { // zip the outbound message } } ... }