I am learning spring and have a little problem. I have 3 entities to implement the same form.I follow another topic where it created a new class to handle all. I did, but I'm getting errors. Could help me?
Error:
HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/views/index/cadastro.jsp at line 31
type Exception report
message An exception occurred processing JSP page /WEB-INF/views/index/cadastro.jsp at line 31
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/index/cadastro.jsp at line 31
28: </div>
29: <div class="col-md-8">
30: <div class="col-md-12">
31: <form:input type="text" required= "true" style= "border: 2px solid #DDDDDD" class="input-xxlarge" path="user.fullname" />
32:
33: </div>
34: </div>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:567)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:464)
org.apache.jasper.servlet.JspServlet._serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:168)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
root cause
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'register' available as request attribute
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:141)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116)
org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
org.apache.jsp.WEB_002dINF.views.index.cadastro_jsp._jspx_meth_form_005finput_005f0(cadastro_jsp.java:1077)
org.apache.jsp.WEB_002dINF.views.index.cadastro_jsp._jspService(cadastro_jsp.java:328)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)
org.apache.jasper.servlet.JspServlet._serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:168)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
UserController.Java
@Controller
@RequestMapping("user")
public class UserController {
private static final Logger LOGGER = Logger.getLogger(UserController.class);
@Autowired
private UserService service;
@Autowired
private EnderecoService enderecoService;
@Autowired
private TelefoneService telefoneService;
@InitBinder
protected void initBinder(ServletRequestDataBinder binder) {
binder.registerCustomEditor(Perfil.class, new PerfilConverter());
}
@RequestMapping("/add")
public String userPage(@ModelAttribute("register") RegisterForm registerForm) {
LOGGER.debug("Accessed userAdd page!");
return "index/cadastro";
}
@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView save(@ModelAttribute("register") RegisterForm registerForm) {
LOGGER.debug("Saving a new user...");
User oldUser = service.findUserByEmail(registerForm.user.getEmail());
if (oldUser != null) {
return new ModelAndView("index/cadastro", "error", "This email already exists, try a new email!");
}
if (!registerForm.user.getPassword().equals(registerForm.user.getPasswordRepeated())) {
return new ModelAndView("index/cadastro", "error", "Passwords do not match!, try again!");
}
registerForm.user.addEndereco(registerForm.endereco);
registerForm.user.addPhone(registerForm.telefone);
String email = registerForm.user.getEmail();
service.createUser(registerForm.user);
enderecoService.save(registerForm.endereco, email);
telefoneService.save(registerForm.telefone, email);
return new ModelAndView("redirect:/auth/form");
}
@RequestMapping("/{id}")
public ModelAndView getUser(@PathVariable("id") Long id, ModelMap model) {
LOGGER.debug("Getting user by id {" + id + "}");
User user = service.findById(id);
model.addAttribute("register", user);
return new ModelAndView("register", model);
}
@RequestMapping("/list")
public ModelAndView getUsers(ModelMap model) {
LOGGER.debug("List of Users");
model.addAttribute("users", service.findUsers());
return new ModelAndView("users", model);
}
}
RegisterForm.java
public class RegisterForm {
public User user;
public Telefone telefone;
public Endereco endereco;
}
Cadastro.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Consultora Online</title>
</head>
<body>
<%@include file="../header.jsp" %>
<div id="contact" class="contact">
<div class="container">
<c:if test="${not empty error}">
<p><font color="red">${error}</font> </p>
</c:if>
<c:url var="save" value="/user/save"/>
<form:form modelAttribute="register" action="${save}" class="form-horizontal">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<legend>Dados Pessoais</legend>
<div class="col-md-4">
<label class="control-label" for="firstName">Nome completo</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" required= "true" style= "border: 2px solid #DDDDDD" class="input-xxlarge" path="user.fullname" />
</div>
</div>
<br/>
<div class="col-xs-8 col-md-4"style="float:left">
<label class="control-label" for="sexo">Sexo </label>
</div>
<div class="col-md-8">
<div class="col-xs-8 col-md-4"style="float:left">
<form:select path="user.sexo" required="true" class="form-control" >
<form:option value="FEMININO" label="FEMININO" />
<form:option value ="MASCULINO" label = "MASCULINO" />>
</form:select>
</div>
</div>
<div class="col-md-4" style="float:left">
<label class="control-label" for="dateOfBirth">Data de Nascimento</label>
</div>
<div class="col-md-8">
<div class="col-md-4" style="float:left">
<form:input type="date" style="border: 2px solid #DDDDDD " required="true" path="user.nascimento" placeholder="dd/mm/aaaa"/>
</div>
</div>
<legend>Dados de acesso</legend>
<div class="col-md-4">
<label class="control-label" for="Email">Email</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" style="border: 2px solid #DDDDDD" required="true" class="input-xxlarge" path="user.email" />
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="senha">Senha</label>
</div>
<div class="col-md-8">
<div class="col-md-6">
<form:input type="password" style="border: 2px solid #DDDDDD" class="input-xlarge" path="user.password" />
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="confirmaSenha">Confirma Senha</label>
</div>
<div class="col-md-8">
<div class="col-md-6">
<form:input type="password" required="true" style="border: 2px solid #DDDDDD" class="input-xlarge" path="user.passwordRepeated" />
</div>
</div>
<legend>Dados Complementares</legend>
<div class="col-md-4">
<label class="control-label" for="postCode">CEP</label>
</div>
<div class="col-md-8">
<div class="col-md-6">
<form:input type="text" style="border: 2px solid #DDDDDD" path="endereco.cep"/>
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="postCode">Telefone</label>
</div>
<div class="col-md-8">
<div class="col-md-6">
<form:input type="text" style="border: 2px solid #DDDDDD" path="telefone.telefone"/>
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="Endereco">Endereço</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" style="border: 2px solid #DDDDDD" class= "input-xxlarge" path="endereco.logradouro"/>
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="postCode">Número</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" style="border: 2px solid #DDDDDD" path="endereco.numero"/>
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="postCode">Complemento</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" style="border: 2px solid #DDDDDD" path="endereco.complemento"/>
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="postCode">Bairro</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" style="border: 2px solid #DDDDDD" path="endereco.bairro"/>
</div>
</div>
<div class="col-md-4">
<label class="control-label" for="postCode">Cidade</label>
</div>
<div class="col-md-8">
<div class="col-md-12">
<form:input type="text" style="border: 2px solid #DDDDDD" path="endereco.cidade"/>
</div>
</div>
<form:hidden path="perfil" value="USER"/>
<input type="submit" value="Cadastrar">
</form:form>
</div>
</div>
<%@include file="../footer.jsp" %></body>
</body>
</html>
Thank you.
@ModelAttribute
as a method parameter means "Read the attribute from somewhere" but there's nowhere to read it from, so it's null.
Change your handler method to look like this:
@RequestMapping("/add")
public String userPage(Model model) {
model.addAttribute("register", new RegisterForm());
LOGGER.debug("Accessed userAdd page!");
return "index/cadastro";
}