Spring MVC Form: erros não aparecendo
-
27-09-2019 - |
Pergunta
Desculpas se essa pergunta já foi feita antes. Espero que alguém possa intervir e me ajudar a descobrir por que meus erros de validação de formulário não estão aparecendo.
Estou usando a Spring 3.0.3 e o Hibernate e estou usando a validação do JSR-303 para validar minhas entradas de formulário. Eu tenho um controlador de mola que lida com a obtenção de uma página que contém um formulário criado com a ajuda do formulário da primavera Taglib. Nesse formulário, um usuário pode alterar seu nome e salvá -lo no banco de dados. Se alguma entrada estiver vazia, a página com o formulário deve ser exibida novamente com mensagens de erro. O mesmo controlador lida com o envio da página. Parece que o controlador está funcionando corretamente na maioria dos aspectos, mas quando há um erro no formulário enviado do usuário, nenhum erro está aparecendo na página.
Aqui está como é a forma:
<form:form commandName="changeNameCommand">
<form:errors path="*" cssClass="errorBox" />
<table width="100%" border="0" cellspacing="5" cellpadding="5" align="left">
<tr>
<td><b>First Name:</b></td>
<td><form:input path="firstName" value="${user.firstName}" /></td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td> <form:input path="lastName" value="${user.lastName}" /></td>
</tr>
</table>
</form:form>
Observe que existe um objeto de usuário na visualização usado para preencher o formulário com o primeiro e o sobrenome atual do usuário. Isso está funcionando corretamente.
O controlador se parece com o seguinte:
@Controller
@RequestMapping(value = "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {
@ModelAttribute("changeNameCommand")
public ChangeNameCommand getCommand() {
return new ChangeNameCommand();
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getChangeNamePage(HttpServletRequest req) {
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
@RequestMapping(method = RequestMethod.POST)
public String doChangeName(
@ModelAttribute("changeNameCommand")
@Valid ChangeNameCommand command,
BindingResult result, SessionStatus status) {
if (result.hasErrors()) {
return "redirect:/account/settings/change-name";
}
// Code here to persist updated user first and last name to database...
status.setComplete();
return "redirect:/home";
}
}
estou a usar Ladrilhos 2.1.2 Para compor páginas e URLREWRITE 3.1.0 para ajudar a formar URLs amigáveis.
A classe ChanGenameCommand se parece mais disso:
import org.hibernate.validator.constraints.NotEmpty;
public class ChangeNameCommand {
@NotEmpty(message = "You must provide a first name.")
private String firstName;
@NotEmpty(message = "You must provide a last name.")
private String lastName;
@NotEmpty(message = "Your password is required to make changes.")
private String currentPassword;
// Getters and setters here...
}
Ao depurar, vejo que quando não há entrada para o primeiro ou sobrenome, a instância BindingResult contém erros. Minha preocupação é o redirecionamento quando há um erro. Vi outras perguntas aqui que apenas retornam o nome da visualização em vez de usar o Redirect: Prefixo. Eu tentei isso, mas (eu acho) por causa da maneira como estou usando o UrLrewrite e a maneira como meu mapeamento de servlet está configurado, o Spring retorna um erro. Eu tentei voltar
/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name
mas sem sucesso. FWIW, aqui está o meu mapeamento de servlet:
<servlet-mapping>
<servlet-name>mywebsite</servlet-name>
<url-pattern>/web/*</url-pattern>
</servlet-mapping>
Qualquer ajuda muito apreciada!
Solução 2
Aqui está como eu resolvi meu problema. Para começar, eu não queria abandonar meu uso do UrLrewriteFilter e Tiles. No entanto, o problema com isso era que, no caso de erros, eu não podia simplesmente devolver o caminho, conforme indicado nos controladores RequestMapping
anotação. Abaixo está minha solução, com o redirecionamento removido no caso de erros, em doChangeName()
.
@Controller
@RequestMapping(value = "/account/settings/change-name")
@SessionAttributes("changeNameCommand")
public class ChangeNameController {
@ModelAttribute("changeNameCommand")
public ChangeNameCommand getCommand() {
return new ChangeNameCommand();
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getChangeNamePage() {
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView doChangeName(@ModelAttribute("changeNameCommand") @Valid ChangeNameCommand command,
BindingResult result, SessionStatus status) {
if (result.hasErrors
ModelAndView mav = new ModelAndView("Account.ChangeName");
mav.addObject("page_title", "Change Name");
return mav;
}
// Code here to persist updated user first and last name to database...
status.setComplete();
RedirectView view = new RedirectView("/home");
return new ModelAndView(view);
}
}
Obrigado a todos que me ajudaram nisso!
Outras dicas
usando redirect
Faz todos os atributos de solicitação (incluindo erros e todo o modelo) desaparecem. Portanto, não use o redirecionamento ou use a sessão para armazenar temporariamente os dados ou usar conversas. Ou descubra como usar algo como uma escopo do flash (estou prestes a fazer em um tempo)
Outra coisa - usando UrlRewriteFilter
com o Spring-MVC é desnecessário. Você tem controle total sobre seus URLs de repouso, apenas com Spring-MVC.