Exceção em JAVA

12 respostas
javaspringexception
guilhermebhte

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!");
	}
}

12 Respostas

D

como está a classe BairroEntity

guilhermebhte

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;
	}
}
D

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

guilhermebhte

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.

rmendes08

Você está usando algum framework, qual ?

D

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.

guilhermebhte

@rmendes08, spring

guilhermebhte

@Darkelf, tem algum exemplo ?

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

B
@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.

guilhermebhte

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

B

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.

guilhermebhte

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

Criado 30 de agosto de 2017
Ultima resposta 31 de ago. de 2017
Respostas 12
Participantes 4