Mehrere Validatoren mit initBinder hinzufügen
Ich bin das hinzufügen einer Benutzer-validator mit der initBinder
Methode:
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new UserValidator());
}
Hier ist die UserValidator
public class UserValidator implements Validator {
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
public void validate(Object target, Errors errors) {
User u = (User) target;
//more code here
}
}
Den validate
Methode ist immer richtig aufgerufen, während der controller-Methode aufrufen.
@RequestMapping(value = "/makePayment", method = RequestMethod.POST)
public String saveUserInformation(@Valid User user, BindingResult result, Model model){
//saving User here
//Preparing CustomerPayment object for the payment page.
CustomerPayment customerPayment = new CustomerPayment();
customerPayment.setPackageTb(packageTb);
model.addAttribute(customerPayment);
logger.debug("Redirecting to Payment page.");
return "registration/payment";
}
Aber während der Rückkehr in den Zahlung-Bildschirm bin ich immer diese Fehlermeldung:
java.lang.IllegalStateException: Invalid target für Prüfer [com.validator.UserValidator@710db357]: com.domain.CustomerPayment[ customerPaymentId=null ]
org.springframework.die Validierung.DataBinder.setValidator(DataBinder.java:476)
com.web.UserRegistrationController.initBinder(UserRegistrationController.java:43)
Sonne.reflektieren.NativeMethodAccessorImpl.invoke0(Native-Methode)
Sonne.reflektieren.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
Sonne.reflektieren.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflektieren.Methode.invoke(Method.java:597)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.initBinder(HandlerMethodInvoker.java:393)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.updateModelAttributes(HandlerMethodInvoker.java:222)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:429)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
Diese könnte sein, weil ich fahre ein CustomerPayment
und es ist nicht validator definiert.
Ich bin auch nicht in der Lage, mehrere Prüfungen hinzufügen in initBinder
Methode.
Wie kann ich dieses Problem beheben?
InformationsquelleAutor der Frage Ravi | 2013-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie den Wert der
@InitBinder
- Anmerkung zu den Namen von dem Befehl, den Sie möchten, es zu überprüfen. Dies sagt der Frühling, was auf anwenden, um die Bindemittel zu; ohne Sie es wird der Frühling versuchen Sie es anwenden, um alles. Dies ist, warum Sie sehen, dass Ausnahme: der Frühling ist man versucht, die binder - mit IhremUserValidator
- um einen parameter vom TypCustomerPayment
.In Ihrem speziellen Fall, wie es aussieht, brauchen Sie etwas wie:
Zu Ihrer zweiten Frage, wie Rigg802 erklärt, Spring nicht Unterstützung wenn mehrere Prüfungen zu einem einzigen Befehl. Sie können jedoch die Definition mehrerer
@InitBinder
Methoden für die verschiedenen Befehle. So, zum Beispiel, könnten Sie die folgenden in einem einzigen controller und überprüfen Sie Ihre Benutzer-und Zahlungsbedingungen Parameter:InformationsquelleAutor der Antwort Annabelle
Es ist ein bisschen schwierig zu tun, 1 controller hat nur 1 validator von 1-Befehl-Objekts.
müssen Sie erstellen eine "Composite-Validator", die Sie erhalten, alle Prüfungen und führen Sie Sie separat.
Hier ist ein tutorial, das erklärt, wie es zu tun: mit mehreren Prüfungen
InformationsquelleAutor der Antwort Rigg802
Sehe ich nicht einen Grund, warum der Frühling nicht filtern alle Prüfungen, die nicht für die aktuelle Entität standardmäßig die Kräfte zu benutzen, Dinge wie CompoundValidator beschrieben von @Rigg802.
InitBinder
können Sie angeben, nur dem Namen nach, die Ihnen einige Kontrolle, aber nicht die volle Kontrolle darüber, wie und Wann gelten Ihre benutzerdefinierten validator. Die aus meiner Sicht nicht genug.Andere Sache, die Sie tun können, ist die Durchführung selbst zu prüfen und add-validator binder nur, wenn es tatsächlich erforderlich, da Bindemittel sich hat binding-Kontext-Informationen.
Zum Beispiel, wenn Sie möchten, fügen Sie eine neue Prüfung die mit Ihrem Benutzer-Objekt zusätzlich zu den built-in Validatoren schreiben Sie etwas wie dieses:
}
InformationsquelleAutor der Antwort Konstantin Kulagin
Können Sie mehrere Prüfungen durch Iteration über alle org.springframework.die Validierung.Validator in eine Datei ApplicationContext und einrichten geeignet sind, die in @InitBinder für jede Anforderung.
Sehen, wie mein Projekt für Beispiele und einfache benchmarks. https://github.com/LyashenkoGS/spring-mvc-and-jms-validation-POC/tree/benchamark
InformationsquelleAutor der Antwort Hryhorii Liashenko
Mehrere validator auf ein Befehl unterstützt wird, der mit Spring MVC 4.x jetzt. Man konnte mit diesem snippet-code:
InformationsquelleAutor der Antwort hunglevn
Es ist ein einfacher hack, immer wieder
true
imsupports
Methode, und delegieren die Klasse überprüfung dervalidate
. Dann im Grunde können Sie mehrere Prüfer in derinitBinder
ohne Problem.InformationsquelleAutor der Antwort GMsoF
Außerdem, @Annabelle, jetzt ist es möglich, zwei
Validator
s, wie folgend, nur das hinzufügen autowired Prüfungen (Bohnen deklariert sind, inspring-context.xml
), und nur mit Ihnen.InformationsquelleAutor der Antwort Ashot Karakhanyan
Anfrage erklären wie
(... , Model model,HttpServletRequest request)
und ändern
zu
InformationsquelleAutor der Antwort jiangjiang