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