[英]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.