Question

Toutes mes excuses si cette question a été posée. J'espère que quelqu'un peut intervenir et me aider à comprendre pourquoi ma forme d'erreurs de validation ne se présentent pas.

J'utilise Spring 3.0.3 et Hibernate, et j'utilise la validation JSR-303 pour valider mes entrées de formulaire. J'ai un contrôleur qui ressort des poignées deviennent une page qui contient un formulaire qui est créé avec l'aide de la forme de printemps de taglib. Sous cette forme, un utilisateur est en mesure de changer leur nom et l'ont enregistré dans la base de données. Si l'une de l'entrée est vide, la page avec le formulaire doit être affiché avec des messages d'erreur. Le même contrôleur gère la présentation de la page. Il semble que le contrôleur fonctionne correctement dans la plupart des égards, mais quand il y a une erreur dans la forme fournie par l'utilisateur, aucune erreur ne s'affiche pas sur la page.

Voici quelle forme ressemble à:

<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>    

Notez qu'il existe un objet utilisateur dans la vue qui est utilisé pour remplir le formulaire avec nom et prénom de l'utilisateur courant. Cela fonctionne correctement.

Le contrôleur ressemble à quelque chose comme ceci:

@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";
    }
}

J'utilise Tiles 2.1.2 aux pages et Compose UrlRewrite 3.1.0 forme d'aide amicale urls.

Les looks de classe ChangeNameCommand quelque chose comme ceci:

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...
}

Lors du débogage, je vois que lorsqu'il n'y a pas d'entrée pour la première ou nom l'instance BindingResult contient des erreurs. Ma préoccupation est la redirection quand il y a une erreur. Je l'ai vu d'autres questions à poser que juste revenir le nom de vue au lieu d'utiliser la redirection: préfixe. J'ai essayé, mais (je pense) à cause de la façon dont je me sers UrlRewrite et la façon dont mon mappage de servlet est configuré Spring renvoie une erreur. Je l'ai essayé retour

/account/settings/change-name
/web/account/settings/change-name
/mywebsite/web/account/settings/change-name

mais en vain. FWIW, voici mon servlet-mapping:

<servlet-mapping>
    <servlet-name>mywebsite</servlet-name>
    <url-pattern>/web/*</url-pattern>
</servlet-mapping>

Toute aide appréciée!

Était-ce utile?

La solution 2

Voici comment je résolu mon problème. Pour commencer, je ne voulais pas laisser tomber mon utilisation de UrlRewriteFilter et des tuiles. Cependant, le problème était que, dans le cas d'erreurs, je ne pouvais pas retourner le chemin, comme indiqué dans les contrôleurs annotation RequestMapping. Voici ma solution, avec le redirect enlevé dans le cas d'erreurs, dans 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);        
    }
}

Merci à tous ceux qui m'a aidé à ce sujet!

Autres conseils

à l'aide redirect fait tous les attributs de demande (y compris les erreurs et le modèle entier) disparaissent. Donc, ne pas utiliser redirect, ou utiliser la session pour stocker temporairement les données, ou les conversations d'utilisation. Ou comprendre comment utiliser quelque chose comme un champ flash (je suis sur le point dans un certain temps)

Une autre chose - en utilisant UrlRewriteFilter avec-mvc de printemps est déplacée. Vous avez le contrôle total sur votre beatuful REST comme URL avec ressort mvc seulement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top