7 Stimmen

Spring MVC 3.0: Wie können Pfadvariablen effizient validiert werden, die global für alle Request-Mappings sind?

Ich versuche, mich mit Spring MVC 3.0 vertraut zu machen, und obwohl ich es zum Laufen bringen kann, scheine ich dieses bestimmte Szenario nicht effizient behandeln zu können.

Ich habe einen Controller, der den Präfix "/{studyName}/module" behandelt, und er sieht ungefähr so aus:

@Controller
@RequestMapping(value = "/{studyName}/module")
public class ModuleController {

    @RequestMapping(...)
    public ModelAndView getA(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getB(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getC(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }

    @RequestMapping(...)
    public ModelAndView getD(@PathVariable String studyName, ...) {
        if (!validStudy(studyName)) { return bad request; }
        ...
    }
}

Das Problem bei diesem Code ist, dass die Validierung des studyName über alle Methoden verstreut ist und möglicherweise auch in den Methoden anderer Controller. Gibt es eine Möglichkeit, die Validierung des studyName-Path-Variablen an einer Stelle durchzuführen, ohne etwas wie AOP verwenden zu müssen? Wie behandeln Sie solche Validierungen?

Vielen Dank.

2voto

GaryF Punkte 23306

Aktuell ist es noch etwas schwierig, dies automatisch zu erreichen, aber es ist möglich. Sie sollten einen Bean-Validierungs (JSR-303) Anbieter verwenden, der Anhang C implementiert. Derzeit sind das Apache BeanValidation oder Hibernate Validator 4.2 (das sich in der Beta-Phase befindet).

Fügen Sie Ihre ausgewählte Bean-Validierungs-Implementierung dem Klassenpfad hinzu. Dies wird die Implementierung von JSR-303 sein, die von Spring MVC verwendet wird.

Zweitens kennzeichnen Sie den Methodenparameter mit @Valid und allen Constraint-Annotationen, z. B. @NonNull.

Dies wird ungefähr so aussehen:

public ModelAndView getB(@Valid @NonNull @PathVariable String studyName, ...) {

Das sollte funktionieren. Sie müssten dann Ihre Spring-Fehler überprüfen, ob es Probleme gibt.

Alternativ, wenn Sie keine anderen Spring-Parameter verwenden, können Sie einen Validator mit einem InitBinder registrieren, wie folgt:

@InitBinder
public void initBinder(WebDataBinder binder) {
  binder.setValidator(new StudyNameValidator());
}

1voto

Eric Winter Punkte 910

Erstellen Sie eine Klasse StudyName, registrieren Sie dann einen WebArgumentResolver für StudyName und lassen Sie dort Ihre Validierung stattfinden.

   public ModelAndView getA(@PathVariable StudyName studyName){
      ...
   }

   public class StudyNameResolver implements WebArgumentResolver{
      // have resolveArgument method do validation if resolved to a StudyName
   }

1voto

tsunade21 Punkte 3412

Ich fange an, Spring 3 zu verwenden und ich mag deine Lösung, auf diese Weise zu validieren: public ModelAndView getB(@Valid @NonNull @PathVariable String studyName, ...) {

Wenn jedoch das Path-Variable ungültig ist (in diesem Fall studyName = null), wie fängst du den Fehler ein und zeigst ihn an?

Ich habe versucht, das Bindungsergebnis zu verwenden, aber es funktioniert einfach nicht. Außerdem, weißt du, wie man den Fehler auf der JSP-Seite anzeigen kann?

Danke

0voto

DrUseful Punkte 305

Erstellen Sie eine einfache Validierungsklasse:

public class StudyValidator {
    public boolean validateStudy(String studyName) {
        //Ihre Validierungslogik hier
    }
}

dann fügen Sie es in den ModuleController ein:

class ModuleController {
    private StudyValidator sv = new StudyValidator(); //verwenden Sie Spring-Inject, um zu befüllen.
    boolean validStudy(String studyName) {
        return sv.validateStudy(studyName);
    }
}

Einfach.

0voto

mezmo Punkte 2391

Hmmm, ich bin mir nicht sicher, ob es funktionieren würde, aber du könntest die @Valid Annotation nutzen, wie in diesem Link über Validatoren kurz erwähnt.

Viel Glück!

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