由ModelAttribute注释的多个方法。如何设置方法的调用顺序

时间:2013-09-13 10:16:05

标签: java spring spring-mvc controller

我有@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方法调用?

2 个答案:

答案 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