2012-03-27 8 views
0

Ich habe einige gute Stunden damit verbracht, also ist es Zeit zu fragen.Wie wird eine Fehlermeldung vom Spring Validator angezeigt?

-Controller

@RequestMapping(value="/articleHeaderEdit/{articleId}", method=RequestMethod.POST) 
public ModelAndView submitHeader(@PathVariable Integer articleId, @ModelAttribute("screenObject") ArticleHeaderEditScreenObject articleHeaderEditScreenObject, @ModelAttribute("article") Article article, BindingResult bindingResult, Model model, Locale locale) throws Exception { 
    validator.validate(articleHeaderEditScreenObject, bindingResult); 

    ModelAndView modelAndView=new ModelAndView(); 

    if(bindingResult.hasErrors()) { 
     initializeScreenObject(articleHeaderEditScreenObject, article, locale); 
     modelAndView.setViewName(WebView.ARTICLE_HEADER_EDIT_PAGE.getViewName()); 

    } else { 
     modelAndView.setViewName("redirect:/article/" + articleId); 
    } 

    return modelAndView; 
} 

Validator

@Component 
public class ArticleHeaderEditScreenObjectValidator implements Validator { 
    @Override 
    public boolean supports(Class<?> clazz) { 
     return ArticleHeaderEditScreenObject.class.isAssignableFrom(clazz); 
} 

@Override 
public void validate(Object validatedObject, Errors errors) { 
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "required.title", "Title is required."); 
} 

Ansicht (nur die relevanten HTML)

<form:form modelAttribute="screenObject" action="${screenObject.getFormAction()}"> 

    <form:errors path="*" /> 

    <form:errors /> 

    <form:input path="title" /> 
    <form:errors path="title" /> 

Der Fehler ist da. Ich bekomme die richtige Ansicht und überprüfe das Debugging. Keines der drei Fehler-Tags funktioniert jedoch. Wenn ich die Seite absende, speichert sie neu eingegebene Daten, so dass das Modell funktioniert.

Ich sehe eine Menge Leute, die damit kämpfen. Allgemein ist es die Tatsache, dass das Modellattribut in der Form und im Controller einen anderen Namen hat, aber in diesem Fall sind sie identisch. Irgendeine Idee, was noch fehlt?

+0

können Sie Ihren Validator Code posten? –

+0

Ich habe meinen Validator hinzugefügt und den Code aktualisiert. Ich versuche immer noch, Dinge zum Laufen zu bringen. – jacekn

+0

Es stellt sich heraus, dass Spring über das zweite Modellattribut im Post verwirrt ist. Wenn ich '@ModelAttribute (" article ") Artikel Artikel aus der Parameterliste nehme, erscheinen die Fehler auf der Seite. Sehr, sehr verwirrendes Zeug ... – jacekn

Antwort

2

Das Geheimnis ist in der Reihenfolge der Parameter, die Sie in submitHeader Methode übergeben.

Die Quelldokumentation legt eindeutig fest, dass das Argument BindingResult bindingResult genau nach dem Modellobjekt geschrieben werden soll, das Sie validieren möchten.

Wenn Sie also mehrere ModelAttributes übergeben, die BindingResult haben, nachdem alle Fehler an das Objekt gebunden wurden.

In Ihrem Fall wird das BindingResult spezifische Fehler für Article Objekt und nicht ArticleHeaderEditScreenObject Objekt haben.

Referenz Kommentar ab Frühjahr Dokumentation:

Die Fehler oder BindingResult Parameter haben die Modellobjekt zu folgen, die unmittelbar als die Methode Unterschrift gebunden wird, kann sich mehr als ein Modell haben Objekt und Frühling wird eine separate BindingResult erstellen Beispiel für jeden von ihnen, so wird die folgende Probe nicht:

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#d0e29628

Verwandte Themen