The invoke() method in ExchangeInvocation treats all fault messages as though they do not contain exceptions due to some faulty logic:
Note how the return from getMessage() is assigned to the error var instead of getMessage().getContent(). This means all exceptions are converted to Strings. Good news is that no error content is lost since the conversion to String includes the entire exception hierarchy. Bad news is that if you are hunting for the actual Exception reference in code that uses ExchangeInvocation, you'll be disappointed.