Exceção em JAVA

Como mostrar esta exceção em um modo mais amigável.

Código

public void excluir(Long id) {
	try {
		BairroEntity bairro = buscarPorId(id);
		bairroRepositorio.remover(bairro, id);
	} catch (DataIntegrityViolationException e) {
		throw new Excecoes("Entidade não pode ser removida, pois contém registros vinculados!");
	}
}

como está a classe BairroEntity

Segue

package br.com.netsoft.desif.model.endereco;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import br.com.netsoft.desif.model.DesIfEntity;
import br.com.netsoft.desif.model.desif.federal.MunicipioEntity;

/**
 * Bairros dos paises, estados e municipios
 */
@Entity
@Table(name = "end_bairros", schema = "enderecos")
public class BairroEntity implements Serializable {

	private static final long serialVersionUID = -4597552877430986176L;
	private Long id;
	private PaisEntity pais;
	private EstadoEntity estado;
	private MunicipioEntity municipio;
	private String descricao;

	@Id
	@Column(name = "bai_id")
	@SequenceGenerator(name = "enderecos.end_bairros_bai_id_seq", sequenceName = "enderecos.end_bairros_bai_id_seq", allocationSize = 1)
	@GeneratedValue(generator = "enderecos.end_bairros_bai_id_seq", strategy = GenerationType.SEQUENCE)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@ManyToOne
	@JoinColumn(name = "pai_id")
	public PaisEntity getPais() {
		return pais;
	}

	public void setPais(PaisEntity pais) {
		this.pais = pais;
	}

	@ManyToOne
	@JoinColumn(name = "est_id")
	public EstadoEntity getEstado() {
		return estado;
	}

	public void setEstado(EstadoEntity estado) {
		this.estado = estado;
	}

	@ManyToOne
	@JoinColumn(name = "mun_id")
	public MunicipioEntity getMunicipio() {
		return municipio;
	}

	public void setMunicipio(MunicipioEntity municipio) {
		this.municipio = municipio;
	}

	@Column(name = "bai_descricao")
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}

Estranho, mas olha no seu banco quais são as dependências dessa tabela.

A exceção está ok, isto é, ela tem que aparecer mesmo.

O que quero melhorar é a apresentação para o cliente.

Tipo mostrar no html.

Você está usando algum framework, qual ?

Viajei agora…

Mas bem, no seu controller você precisa capturar essa exceção, e adicionar ela se não me engano no BindingResult ou algo assim do Spring. Porque do jeito que está fazendo a exceção vai estourar na cara do usuário mesmo.

A outra possibilidade é utilizar o @ControllerAdvice também do Spring para capturar exceções configuradas e e fazer a tratativa adequada da exceção.

Já no Thymeleaf vai depender de como você quer que seja exibido, já que não sei como você está utilizando ele.

@rmendes08, spring

@Darkelf, tem algum exemplo ?

Posso capiturar esta exceção. Colocar o resultado no ModelAndView e pelo Thymeleaf tenho uma tag < label th:if="">, entendeu ?

   @RequestMapping("adicionaTarefa")
   public String adiciona(@Valid Tarefa tarefa, BindingResult result) {
   if(result.hasErrors()) {
   //aqui você pode colocar alguma nova página para mostrar o erro ou utilizar Ajax para destacar os erros.
   }

Mas pensando bem, esse BindingResult só retorna erros quando os validações do objeto “tarefa” não deram certo, não?

Soluções que eu pensei:

-Eu sei que existe uma anotação em Spring que é algo como @HandlerException, para lidar quando as exceções ocorrem.
-Sei que dá para mapear o estado da requisição HTTP, e quando ela retornar 404(por exemplo) direcionar para uma página específica.
-Chamar um novo controller no catch da exceção?

Mas enfim, acho melhor esperar alguém que já lidou com isso.

@edit

Acho que utilizar Interceptor é uma boa também.

Estava usando o @Valid, Este @Valid só funciona para classes com a anotação @Entity ou para uma simples DTO ?

Não precisa da anotação @Entity, funciona em classes simples(java beans). Só precisa baixar as jars do bean validator e salvo engano alguma jar do hibernate.

Já tenho os dois jar no projeto, pelo pom.