簡體   English   中英

Spring MVC 3.0:如何有效地驗證對所有請求映射都是全局的路徑變量?

[英]Spring MVC 3.0: How to validate path variable that is global to all request mappings efficiently?

我正試圖用Spring MVC 3.0弄清楚,雖然我可以讓它工作,但我似乎無法有效地處理這種特殊情況。

我有一個控制器,處理“/ {studyName} /模塊”前綴,它看起來像這樣: -

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

這段代碼的問題是,我將studyName驗證分散在所有方法中,也可能分散在其他控制器的方法中。 有沒有辦法我可以在一個點上對studyName路徑變量進行驗證而不使用像AOP這樣的東西? 你如何處理這樣的驗證?

謝謝。

現在,讓這種情況自動發生有點棘手,但這是可能的。 您應該使用實現附錄C的Bean驗證(JSR-303)提供程序。目前,這是Apache BeanValidation或Hibernate Validator 4.2(處於測試階段)。

將您選擇的bean驗證實現添加到類路徑中。 這將是Spring MVC使用的JSR-303的實現。

其次,使用@Valid和任何約束注釋(如@NonNull)注釋方法參數。

這看起來像:

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

這應該工作。 然后,您需要檢查Spring錯誤是否存在任何問題。

或者,如果您不使用任何其他Spring參數,則可以使用InitBinder注冊驗證器,如下所示:

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

創建一個StudyName類,然后為StudyName注冊一個WebArgumentResolver,並在那里進行驗證。

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

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

我開始使用spring 3,我確實喜歡這種驗證方法:public ModelAndView getB(@Valid @NonNull @PathVariable String studyName,...){

但是,一旦pathvariable無效(在本例中為studyName = null),您如何捕獲並顯示該錯誤?

我試圖使用綁定結果,但它只是不起作用。 另外,你知道如何在jsp上顯示錯誤嗎?

謝謝

創建一個簡單的驗證類:

public class StudyValidator {
    public boolean validateStudy(String studyName) {
        //your validate logic here
    }
}

然后將它注入ModuleController

class ModuleController {
    private StudyValidator sv = new StudyValidator(); //use spring injection to populate.
    boolean validStudy(String studyName) {
        return sv.validateStudy(studyName);
    }
}

Simples。

嗯,不確定它是否可行,但你可能能夠在驗證器的這個鏈接中簡要提到 @Valid注釋

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM