Creating abstraction to validate complex objects
So If I understand correctly, clients get an instance of Validator from the factory, call validate() and get an instance of ValidationStatus and then call process() and get an exception (or nothing). so you replaced an if...else block with a try...catch one. the client still have to check the return value to figure out what to fix. and if you ask me, it is more clear to ask
if (result == ValidationFailureCause.MISSING_MANDATORY_FIELDS)
then
} catch (MandatoryElementsMissing mem) {   


in addition, Validator interface contains a method that returns a boolean. how do you plan to prevent clients from calling it?  


If we go along with your solution: the whole ValidationStatus class tree seems redundat to me.  It is just a wrappper over throwing a user defined Exception.  It doesn't provide extra capabilities beyond translate an enum into an Exception (considering that exceptions can also have String message). So I believe a design where validate() throws an Exception provides the same functionality.  If you don't want to throw the Exception super class, you can create a ValidationException super class and have all your custom exceptions extend it (much like Java's ReflectiveOperationException)
Your design determines that for a given type, there can only be one Validator.  This may be fine for user-defined types like FlightProposalRequest but it may be too restrictive for JDK types like String.  I imagine that you want to validate that getDepartureDate() is a valid date, and perhaps validate getDepartureAirport() against predefined list of airports (perhaps an SQL query) and so on.  You should assocaite a Validator with a String name (perhaps an enum).
lastly, regartding the validation of the attributes, I believe you can write it like this:     


return requestValidator.isValid(request.getArrivalAirport())
&amp;&amp; requestValidator.isValid(request.getDepartureAirport())
&amp;&amp; requestValidator.isValid(request.getDepartureDate())
&amp;&amp; requestValidator.isValid(request.getReturnDate());     

this has the same (if not more) level of readability as the original.