[Resolvido]Spring injetar exception

3 respostas
guilherme.dio

Boa tarde,

Gostaria de saber se há como fazer com que o Spring(MVC) injete qualquer tipo de Exception ou até mesmo Throwable em um Action de meu controller de erros.

Queria algo assim:

@Controller
@RequestMapping("/")
public class ErrorController 
{
	@RequestMapping("404")
	public String pageNotFound()
	{
		return "error/404";
	}
	
	@RequestMapping("exception")
	public String exception(Exception ex)
	{
                //Tratar o exception, ou até mesmo guardar em log
		return "error/exception";
	}
}

3 Respostas

WRYEL

Tem uma maneira para você direcionar para páginas específicas via xml, ex:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.Exception">template/erro</prop>
			</props>
		</property>
	</bean>

e tem este jeito que eu não conhecia e achei no google agora que acho que vai mais com o que você precisa (inclusive já estou fazendo uma POC para teste): http://www.captaindebug.com/2012/02/spring-3-mvc-exception-handlers.html

edit: e temos o response status: http://java.dzone.com/articles/spring-3-mvc-exception-1 (não testei ainda também :o))

[]'s

F

No meu caso a mensagem de erro aparece no padão da linguagem. A mensagem que aparece quando eu não coloco nada em quantidade é dada por

Failed to convert property value of type java.lang.String to required type int for property quantidade; nested exception is java.lang.IllegalArgumentException

mas eu configurei o meu arquivo properties, que está logo abaixo:

NotEmpty.produto.descricao=Deve ser preenchido
NotNull.produto.quantidade=Deve ser preenchida

O meu form.jsp
<%@ taglib uri=“http://www.springframework.org/tags/form” prefix=“form” %>

Cadastro de Produto here Descrição:
Quantidade:

o meu web.xml

<?xml version="1.0" encoding="UTF-8"?>


estoque

<filter>
	<filter-name>hibernateFilter</filter-name>
	<filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>hibernateFilter</filter-name>
	<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
</filter-mapping>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/app-config.xml</param-value>
</context-param>

<servlet>
	<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring/empty.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
	<url-pattern>*.html</url-pattern>
</servlet-mapping>
<welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

o meu contolador a classe ProdutoController.java
package br.com.caelum.estoque.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Controller;

import org.springframework.transaction.annotation.Transactional;

import org.springframework.ui.Model;

import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;

import br.com.caelum.estoque.dao.GeradorDeMovimentacao;

import br.com.caelum.estoque.dao.MovimentacaoDAO;

import br.com.caelum.estoque.dao.ProdutoDAO;

import br.com.caelum.estoque.model.Movimentacao;

import br.com.caelum.estoque.model.Produto;
@Controller

@RequestMapping(value="/produtos")

public class ProdutoController {
@Autowired
@Qualifier("produtoHibernateDAO")
private ProdutoDAO produtoDAO;
@Autowired
private GeradorDeMovimentacao geradorDeMovimentacao;
@Autowired
private MovimentacaoDAO movimentacaoDAO;

@RequestMapping(value="/listar")
public ModelAndView lista(){
	ModelAndView modelAndView = new ModelAndView("produtos/lista");
	modelAndView.addObject(produtoDAO.lista());
	return modelAndView;
}

@RequestMapping(value= "/form")
public String form(Model model){
	model.addAttribute(new Produto());
	return "produtos/salvar";
}

@RequestMapping(value="/salvar")
@Transactional
public String salvar(@Valid Produto produto, BindingResult result){
	if(result.hasErrors()){
		return "produtos/form";
	}
	
	produtoDAO.salvar(produto);
	geradorDeMovimentacao.geraMovimentacao(produto);
	return "redirect:/produtos/listar.html";
}

@RequestMapping(value="/alterar", method=RequestMethod.POST)
@Transactional
public String alterar(@Valid Produto produto, BindingResult result){
	
	if(result.hasErrors()){
		return "produtos/editar";
	}
	
	Movimentacao movimentacao = geradorDeMovimentacao.geraMovimentacao(produto);
	movimentacaoDAO.salvar(movimentacao);
	produtoDAO.alterar(produto);
	return "redirect:/produtos/listar.html";
}

@RequestMapping(value="/editar")
public ModelAndView editar(long id) {
	Produto produto = produtoDAO.buscarPorId(id);
	ModelAndView modelAndView = new ModelAndView("produtos/editar");
	modelAndView.addObject(produto);
	return modelAndView;
}


@RequestMapping(value="/mostrar/{id}")
public ModelAndView mostrar(@PathVariable long id){
	ModelAndView modelAndView = new ModelAndView("produtos/mostrar");
	modelAndView.addObject(produtoDAO.buscarPorId(id));
	return modelAndView;
}

@RequestMapping(value="/remover/{id}")
public String apagar(@PathVariable long id){
	Produto produto = produtoDAO.buscarPorId(id);
	produtoDAO.remove(produto);
	return "redirect:/produtos/listar.html";
}

}

e a classe controlada, a Produto.java
package br.com.caelum.estoque.model;

import java.util.List;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToMany;

import org.hibernate.validator.constraints.NotEmpty;

import com.sun.istack.internal.NotNull;

@Entity
public class Produto {

@Id
@GeneratedValue
private long id;

@NotEmpty
private String descricao;

@NotNull
private int quantidade;

@OneToMany(mappedBy="produto")
private List<Movimentacao> movimentacoes;

public long getId() {
	return id;
}

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

public String getDescricao() {
	return descricao;
}

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

public int getQuantidade() {
	return quantidade;
}

public void setQuantidade(int quantidade) {
	this.quantidade = quantidade;
}

public List<Movimentacao> getMovimentacoes() {
	return movimentacoes;
}

public void setMovimentacoes(List<Movimentacao> movimentacoes) {
	this.movimentacoes = movimentacoes;
}

}

Até mais

guilherme.dio

WRYEL:
Tem uma maneira para você direcionar para páginas específicas via xml, ex:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop key="java.lang.Exception">template/erro</prop>
			</props>
		</property>
	</bean>

e tem este jeito que eu não conhecia e achei no google agora que acho que vai mais com o que você precisa (inclusive já estou fazendo uma POC para teste): http://www.captaindebug.com/2012/02/spring-3-mvc-exception-handlers.html

edit: e temos o response status: http://java.dzone.com/articles/spring-3-mvc-exception-1 (não testei ainda também :o))

[]'s

Este modo de criar o ExceptionHandler é bem interessante, mas parece que só da pra ser usado no Controller específico onde ocorrer algum tipo de exception…

Eu queria usar no meu controller de erro, qualquer exception que fosse causada em qualquer parte do sistema passe por ele, o qual retorna a pagina de exception com o detalhamento do erro.

Criado 12 de junho de 2012
Ultima resposta 13 de jun. de 2012
Respostas 3
Participantes 3