我有一個Spring MVC的調查申請,其中以各種形式POST稱爲控制器的方法實際上是相同的:Spring MVC的@Validation與標記接口的通用控制器的方法
@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));
}
我怎麼能僅僅通過對頁次@PathVariable(或任何其他參數)基於正確的標記接口@Validated?