我有@Controller:
@Controller
public class CandidateMenuController{
@ModelAttribute(value = "vacancies")
public Set<Vacancy> loadVacancies() {
return vacancyService.getAll();
}
@ModelAttribute(value = "vacanciesForCandidate")
public Set<Vacancy> vacanciesForCandidate(@RequestParam(required = false) List<Integer> vacanciesSelected,
@ModelAttribute("vacancies")Set<Vacancy> allVacancies ) {
.....
}
}
有时它运作良好,但有时候我看到异常:
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.Set]: Specified class is an interface
显然它取决于@ModelAttrributes方法调用的顺序。
我知道我可以手动调用@ModelAttribute方法中的必要方法但是 如何管理@ModelAttribute方法调用?
答案 0 :(得分:3)
你不能,基本上方法上的@ModelAttribute
注释不能与参数上的@ModelAttribute
注释结合使用。而且我也强烈反对它。它使你的控制器变得非常脆弱并且容易出错(imho就是这样)。
为什么不简单地写一个方法返回void,包括Model
作为参数并完成?
@ModelAttribute
public void referenceData(@RequestParam(required=false) List<Integer> vacanciesSelected, Model model) {
Set<Vacancy> vacancies= vacancyService.getAll();
model.addAttribute("vacancies", vacancies);
if (vacanciesSelected != null && !vacanciesSelected.isEmpty() ) {
Set<Vacancy> vacanciesForCandidate = // Do something with the set
model.addAttribute("vacanciesForCandidate", vacanciesForCandidate);
}
}
不依赖于方法排序的强大解决方案。
答案 1 :(得分:0)
此功能被视为improvement,最新版本的spring框架支持@ModelAttribute注释方法的相互依赖。
有关详细信息,请参阅此commit