My personal choice would be to use service-specific exceptions, with an eye on the JAX-WS 2.1 specification document, sections 2.5, 3.7 and 6.4.
If you are doing Java-first development, JAX-WS will help you translate the service-specific exceptions to appropriate faults.
When developing a JAX-WS client and if the service declares custom faults, these will be translated into Java exceptions.
SOAPFaultException is the basic type of exception being able to carry SOAP related information and faults that are not mapped to any exception will cause this exception to be thrown on the client side.
Clients to services using service specific exceptions will also be able to use the regular Java exception-handling mechanism in dealing with errors, without having to implement error handling based on the contents of a SOAPFaultException.
My personal point of view is that exceptions resulting from unanticipated run-time error should be thrown as SOAPFaultException, other validation error or business exception should be mapped to soap fault as custom java exception.
The following is quoted from book "SOA using java Web Services" chapter 7
between Java exceptions that can reasonably be mapped to a wsdl:fault
message (mapped exceptions) and those that have to be represented as
generic SOAP faults (unmapped exceptions). As an example, it is likely that
when an exception is thrown because input message validation fails, this
would be a mapped exception because the WSDL writer could anticipate
such an exception and define a wsdl:fault message for it. On the other
hand, exceptions resulting from unanticipated run-time errors most likely
will not have a corresponding wsdl:fault message and will need to be
returned as generic SOAP faults.