I actually took a different route her to get to a viable solution. Instead of using a SOAPHandler, I used a Servlet Filter. The Filter gets to the data before the JAX-RPC Runtime code does, so you don't have to worry about properly resetting data in the MessageContext or the RPCInvocation objects which is risky.
The SOAP message needs to conform to the abstract contract defined in wsdl. If that is the case, either JAXRPC implementation will do.