Spring mvc 通用控制器方法中带标记接口的Spring MVC@验证

Spring mvc 通用控制器方法中带标记接口的Spring MVC@验证,spring-mvc,controller,bean-validation,marker-interfaces,Spring Mvc,Controller,Bean Validation,Marker Interfaces,我有一个Spring MVC调查应用程序,其中每个表单帖子调用的控制器方法实际上是相同的: @PostMapping("/1") public String processGroupOne ( Model model, @ModelAttribute("pageNum") int pageNum, @ModelAttribute(GlobalControllerAdvice.SESSION_ATTRIBUTE_NAME) @Validated(S

我有一个Spring MVC调查应用程序,其中每个表单帖子调用的控制器方法实际上是相同的:

@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是多个步骤。要区分一个步骤和另一个步骤,您可以

还有另一种方法,您需要将
验证器
注入控制器,这是您需要的