Como tratar / enviar ao cliente erros de Web Service?

Tenho 2 aplicações:

Uma expõe um web service para salvar a entidade Pessoa (usando springboot). A entidade Pessoa tem um campo email que é unique:

//web service com springboot
    @PostMapping(value = "/save", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE},
					consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
	public Pessoa save(@RequestBody Pessoa pessoa) {	
        // cmapo email é unique, se repetir dá erro...	
			return pessoaRepository.save(pessoa);				
	}

A outra app consome o serviço enviando a entidade Pessoa para salvar (usando Client API do JavaEE sem springboot):

public Pessoa cadastrarPessoa(Pessoa pessoa) {
    Client client = ClientBuilder.newClient();
	WebTarget target = client.target(URL_CADASTRO+ "/save");

	Entity<Pessoa> data = Entity.entity(pessoa, MediaType.APPLICATION_XML_TYPE);

	pessoa = target.request(MediaType.APPLICATION_XML_TYPE).post(data, Pessoa.class);

	return pessoa;
}

O campo email da entidade Pessoa é unique, e ao salvar pode disparar alguma exception de violação de constraint.
Minha é dúvida é, se ocorrer um erro, como dizer isso ao cliente?

Em comunicação usando o protocolo HTTP, você deve usar os códigos de erro apropriados. No seu caso, talvez o código mais apropriado seja o 409 (ou o 412):

The 409 (Conflict) status code indicates that the request could not be completed due to a conflict with the current state of the target resource. This code is used in situations where the user might be able to resolve the conflict and resubmit the request. The server SHOULD generate a payload that includes enough information for a user to recognize the source of the conflict.

obs.: Junto com o código, vc retorna uma mensagem com o detalhe do erro.

Veja: HTTP Status Codes

obrigado por responder, lucastody!

Entendi. Mas dado esse código que eu implementei até agora, como que web service enviaria o código de erro para o cliente? E como que o cliente faria a verificação pra checar se a entidade foi salva com sucesso?

Rafael, um exemplo seria assim.

Você precisaria de uma classe de regra de negocio, no teu exemplo você diz que não pode haver dois emails iguais, então antes de inserir um email você deve procurar se esse email já existe no banco de dados, caso exista você poderia lançar uma exception de regra de negócio, capturar essa exception no teu controller e devolver na resposta do HTTP, com spring boot da para fazer com a classe ResponseEntity.

@PostMapping
	public ResponseEntity<Cliente> persistir(@RequestBody Cliente cliente) {
		
		try {
			
			this.service.persistir(cliente);
			
		} catch (RegraNegocioException e) {
			
                    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR);
			
		}
		
		return ResponseEntity.status(HttpStatus.CREATED).build();			
	}

Só um exemplo vocè poderia trocar o INTERNAL_SERRVER_ERROR, pelo código de erro mais adequado para você como sugeriu o amigo lucastody.

Se for erro de negocio retornar algum código 4xx. Se for erro do sistema mesmo (erro de infra, inesperado, banco, etc.) retorna erro 5xx.

Legal, obrigado, pessoal, mas do lado do cliente como ficaria? Como ela faria a checagem se o objeto persistiu com sucesso ou deu erro no WS e qual foi o erro?

Response response = builder.get(Response.class);

if ( response.getStatusCode() != Response.Status.OK.getStatusCode() ) {
    // Assim, você pega a mensagem de erro como string
    String errorMessage = response.readEntity(String.class);
    return errorMessage;
}

return response.readEntity(MyEntity.class);