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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top