3 Stimmen

Kann keine Fehlermeldung nach fehlgeschlagener Spring Mvc-Formularvalidierung anzeigen

Ich habe Unterricht im Geschäftsmodell:

public class User {
     @Size(min = 3, max = 20, message = "Username must be between 3 and 20 characters long")
     @Pattern(regexp = "^[a-zA-Z0-9]+$", message = "Username must be alphanumeric with no spaces")
     @Column(name = "name")
     private String name;

     @Id
     @GeneratedValue
     @Column(name = "user_id")
     private Long userID;

     @OneToMany(cascade = CascadeType.ALL)
     @JoinTable(name = "userDic", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "user_id") }, inverseJoinColumns = {
 @JoinColumn(name = "acc_id", referencedColumnName = "acc_id") })
     @LazyCollection(value = LazyCollectionOption.FALSE)
     private Set<Account> allAccounts; //............. //constructors , setters , getters here

In jsp erfolgt die Eingabe eines neuen Benutzers über ein Spring-Formular:

<form:form method="post" action="AddUser" modelAttribute="user">
        <table>
            <tr>
                <td><form:label path="name">First Name</form:label></td>
                <td><form:input path="name" /></td>
                <td><form:errors path="*" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="Add User" /></td>
            </tr>
        </table>
    </form:form>

Hier ist Controller, die diese jsp behandeln:

@Controller
@SessionAttributes
public class AdminServlet
{

    /* private UserValidator validator;

     @InitBinder("user")
     protected void initBinder(WebDataBinder binder)
     {
         binder.setValidator(validator);
     }*/

    @RequestMapping(value = "/")
    public ModelAndView showUsers() throws ClassNotFoundException, SQLException
    {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("index");
        mav.addObject("ATMUsers", MainService.getAllUsers());
        mav.addObject("user", new User());
        return mav;
    }

    @RequestMapping(value = "/AddUser", method = RequestMethod.POST)
    public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        if (!result.hasErrors())
            MainService.AddUser(user);
        return "redirect:/";
    }

}

Die Validierung erfolgt korrekt für das Feld name . Aber der Kontrolleur lädt die Seite einfach neu, und ich sehe keine Fehlermeldung.

Wenn ich den Code im Controller über UserValidator y InitBinder Ich erhalte einen Fehler, aber es ist kein Text in <form:errors path="*" /> aber Java-Ausnahme

javax.validation.ConstraintViolationException: Validierung fehlgeschlagen für Klassen [com.antonbanking.business.User] während der Persistenzzeit für Gruppen [javax.validation.groups.Default, ]

Die Frage ist, was ich falsch gemacht habe, so dass ich eine Fehlermeldung zur Validierung erhalte? ÜBRIGENS: Der vollständige Code ist auf Github verfügbar .

4voto

edrozim Punkte 71

Ich löse das Problem selbst - Problem war in der Rückkehr von AdminServlet.AddUser . weil ich gemacht "redirect:/" Dies führt dazu, dass brandneue Objekte einschließlich BindingResult erstellt werden, so dass alle Informationen über den Fehler gelöscht wurden.
Nach dem Wechsel

    @RequestMapping(value = "/AddUser", method = RequestMethod.POST)
    public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        if (!result.hasErrors())
            MainService.AddUser(user);
        return "redirect:/";
    }

à

    @RequestMapping(value = "/AddUser", method = RequestMethod.POST)
    public ModelAndView AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("index");
        mav.addObject("ATMUsers", MainService.getAllUsers());
        if (result.hasErrors())
            mav.addObject("user", user);
        else
        {
            mav.addObject("user", new User());
            MainService.AddUser(user);
        }
        return mav;
    }

Alles beginnt richtig zu funktionieren.

0voto

Aure77 Punkte 2756

Fangen Sie die Ausnahme um MainService.AddUser(user); und fügen Sie in der catch-Klausel Fehler zum BindingResult-Objekt hinzu oder leiten Sie es um.

Voir BindingResult (addError oder reject* von Errors) Siehe auch Validierung (ohne Kommentierung)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X