Frage

Entschuldigt, wenn diese Frage vor gefragt wurde. Ich bin, dass jemand der Hoffnung, in und Hilfe Schritt kann mir herauszufinden, warum meine Form Validierungsfehler nicht zeigen sich.

Ich bin mit Spring 3.0.3 und Hibernate, und ich bin mit JSR-303 Validierung meiner Formulareingaben zu validieren. Ich habe einen Feder Controller, dass Griffe eine Seite erhalten, die ein Formular enthält, die mit Hilfe von Spring Form taglib erstellt wird. In dieser Form ist ein Benutzer in der Lage, ihren Namen zu ändern und hat es in die Datenbank gespeichert. Wenn eine der Eingabe leer ist, dann sollte der Seite mit dem Formular wieder mit Fehlermeldungen angezeigt werden. Der gleiche Controller behandelt die Vorlage Seite. Es scheint, dass der Controller ordnungsgemäß in den meisten Hinsichten funktioniert, aber wenn es einen Fehler in der Benutzer eingereichten Form ist, werden keine Fehler auf der Seite zeigt nach oben.

Hier ist, was aussieht bilden wie:

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

Beachten Sie, dass es ein Benutzerobjekt in der Ansicht ist, dass die Form zu füllen, mit dem Benutzer aktuellem Vor- und Nachnamen verwendet wird. Dies funktioniert einwandfrei.

Der Controller sieht etwa so aus:

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

Ich bin mit Fliesen 2.1.2 compose Seiten und UrlRewrite 3.1.0 Hilfe Formular freundliche URLs.

Die ChangeNameCommand Klasse sieht wie folgt aus:

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

Beim Debuggen, ich sehe, dass, wenn es entweder für den Vor- oder Nachnamen nicht eingegeben wird die BindingResult Instanz Fehler enthält. Meine Sorge ist, die Umleitung, wenn ein Fehler auftritt. Ich habe andere Fragen hier zu sehen, dass nur den Namen der Ansicht zurückzukehren, anstatt die Umleitung verwenden: prefix. Ich habe versucht, das aber (glaube ich) wegen der Art, wie ich bin mit UrlRewrite und die Art und Weise meiner Servletzuordnung Feder festgelegt ist ein Fehler zurück. Ich habe versucht, Rückkehr

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

, aber ohne Erfolg. FWIW, hier ist mein Servlet-Mapping:

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

Jede Hilfe sehr geschätzt!

War es hilfreich?

Lösung 2

Hier ist, wie ich mein Problem gelöst. Zum Auftakt mit, wollte ich nicht meine Verwendung von UrlRewriteFilter und Fliesen fallen zu lassen. Allerdings war das Problem dabei, dass im Fall von Fehlern, kann ich nicht nur den Weg zurückkehren, wie in der Controller RequestMapping Anmerkung angegeben. Unten ist meine Lösung, mit der Umleitung im Fall von Fehlern in doChangeName() entfernt.

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

Danke an alle, die mir geholfen haben auf diesem aus!

Andere Tipps

redirect mit macht alle Anforderung Attribute (einschließlich Fehler und das gesamte Modell) verschwinden. So verwenden Sie keine Umleitung oder die Sitzung verwenden, um die Daten zu speichern, oder die Nutzung Gespräche. Oder herauszufinden, wie so etwas wie ein Blitz-Rahmen zu verwenden (ich bin zu in einer Zeit lang)

Eine andere Sache - mit UrlRewriteFilter mit Feder mvc ist unangebracht. Sie haben die volle Kontrolle über Ihre beatuful REST-ähnliche URLs mit Feder mvc nur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top