0

我有一个 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?

4

1 回答 1

0

因为@Validated是一个注解,所以它要求它的参数在编译期间可用,因此是静态的。您仍然可以使用它,但在这种情况下,您将有 N 个方法,其中 N 是步骤数。要区分一个步骤,您可以使用annotationparams的参数@PostMapping

还有另一种方法,您需要注入Validator控制器并使用您需要的适当组直接调用它

于 2017-05-15T10:50:25.303 回答