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