O parâmetro do formulário é nulo com o Thymeleaf e o Spring MVC
Estou tendo um problema com o Thymeleaf e o Spring MVC.
Estou seguindo um tutorial do site spring.iohttp://spring.io/guides/gs/handling-form-submission/ e quando tentei expandir este tutorial, encontrei um problema.
Se eu adicionar outro parâmetro à minha classe de modelo (no meu exemplo, adicionei um parâmetro Date e um parâmetro long), e não os coloco na minha visualização (imagine que esse parâmetro date seja minha data da última modificação e esse parâmetro long) é um valor aleatório), quando envio esse valor, torna esses 2 parâmetros nulos no meu método.
Aqui estão alguns dos meus códigos.
My model Class
public class Greeting {
private long id;
private String content;
private Date hour;
private long longNumber;
.... getters and setters ....
}
My Controller
@Controller
public class GreetingController {
@RequestMapping(value="/greeting", method=RequestMethod.GET)
public String greetingForm(Model model) {
Greeting greeting = new Greeting();
greeting.setHour(new Date());
greeting.setLongNumber(1234L);
System.out.println(greeting.toString());
model.addAttribute("greeting", greeting);
return "greeting";
}
@RequestMapping(value="/greeting", method=RequestMethod.POST)
public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
System.out.println(greeting.toString());
model.addAttribute("greeting", greeting);
return "result";
}
}
My Form
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Handing Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Form</h1>
<form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
<p>Id: <input type="text" th:field="*{id}" /></p>
<p>Message: <input type="text" th:field="*{content}" /></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>
A página de resultado
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Handing Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Result</h1>
<p th:text="'id: ' + ${greeting.id}" />
<p th:text="'content: ' + ${greeting.content}" />
<p th:text="'Date: ' + ${greeting.hour}" />
<a href="/greeting">Submit another message</a>
</body>
</html>
Estas são as impressões de console da minha classe de modelo
Greeting [id=0, content=null, hour=Sun Apr 26 22:29:25 GMT-03:00 2015, longNumber=1234]
Greeting [id=0, content=aaaa, hour=null, longNumber=0]
Como você pode ver, ambos os meus parâmetros que não estão na minha opinião tornam-se nulos após o post (a segunda linha) e na primeira linha, eles têm valores. Não entendo o porquê, porque vim de outro bom framework (JSF) e não tenho esse problema lá. Só para saber, estou usando a primavera 4, assim como no tutorial, e por que tenho um parâmetro que não está na minha opinião? Como alguns desses parâmetros retêm alguns dados, como a data da última atualização do registro, o último usuário que atualizou o registro e o ID do meu aplicativo.
Alguém pode me ajudar a encontrar uma resposta para isso?
Editar:
Após algum tempo e experimentação, encontrei uma solução para o meu problema. Siga meu pedaço de código que funciona exatamente como deveria ser:
@Controller
@SessionAttributes({"obj"})
public class MyController {
@RequestMapping(value = "/path", method = RequestMethod.GET)
public ModelAndView myGet() {
ModelAndView modelAndView = new ModelAndView("view");
MyClass object = new MyClass();
modelAndView.addObject("obj", object );
return modelAndView;
}
@RequestMapping(value = "/path", method = RequestMethod.POST)
public ModelAndView myPost(@ModelAttribute("obj") @Validated MyClass object, BindingResult result){
ModelAndView modelAndView = new ModelAndView("view");
if(result.hasErrors())
modelAndView.addObject("obj",object);
else
service.save(object);
return modelAndView;
}
}