簡體   English   中英

通用控制器方法中帶有標記接口的Spring MVC @Validation

[英]Spring MVC @Validation with Marker Interface in Generic Controller Method

我有一個Spring MVC調查應用程序,其中每個表單POST調用的Controller方法實際上是相同的:

@PostMapping("/1")
public String processGroupOne (
        Model model,
        @ModelAttribute("pageNum") int pageNum, 
        @ModelAttribute(GlobalControllerAdvice.SESSION_ATTRIBUTE_NAME) @Validated(SurveyGroupOne.class) SurveyCommand surveyCommand, 
        BindingResult result) {
    if (result.hasErrors()) {
        LOG.debug(result.getAllErrors().toString());
        model.addAttribute("pageNum", pageNum);
        return "survey/page".concat(Integer.toString(pageNum));
    }
    pageNum++;
    model.addAttribute("pageNum", pageNum);
    return "redirect:/survey/".concat(Integer.toString(pageNum));
}

唯一的區別是在此過程中的每個停靠點都對SurveyCommand對象的哪一部分進行了驗證。 這由傳遞給@Validated()批注的標記接口指定。 標記接口(SurveyGroupOne,SurveyGroupTwo等)就是這些標記:

public interface SurveyGroupOne {}
public interface SurveyGroupTwo {}
...

並將它們應用於SurveyCommand對象中對象的屬性:

public class Person {
    @NotBlank(groups = {
                    SurveyGroupTwo.class, 
                    SurveyGroupThree.class})
    private String firstName;
    @NotBlank(groups = {
                    SurveyGroupTwo.class, 
                    SurveyGroupThree.class})
    private String lastName;
...
}

我的問題:如何使方法通用,並且仍然使用特定於正在處理頁面的標記接口? 像這樣:

@PostMapping("/{pageNum}")
public String processGroupOne (
        Model model,
        @PathVariable("pageNum") int pageNum, 
        @ModelAttribute(GlobalControllerAdvice.SESSION_ATTRIBUTE_NAME) 
            @Validated(__what goes here??__) SurveyCommand surveyCommand, 
        BindingResult result) {
    if (result.hasErrors()) {
        LOG.debug(result.getAllErrors().toString());
        model.addAttribute("pageNum", pageNum);
        return "survey/page".concat(Integer.toString(pageNum));
    }
    pageNum++;
    model.addAttribute("pageNum", pageNum);
    return "redirect:/survey/".concat(Integer.toString(pageNum));
}

如何僅基於pageNum @PathVariable(或任何其他參數)將正確的標記接口傳遞給@Validated?

因為@Validated是注釋,所以它要求其參數在編譯期間可用,因此是靜態的。 您仍然可以使用它,但是在這種情況下,您將擁有N個方法,其中N是許多步驟。 要區分一個步驟,可以使用@PostMapping注解的params參數

還有另一種方法,您需要將Validator注入控制器, 並直接使用所需的適當組調用它

暫無
暫無

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

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