2

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

4

2 回答 2

3

您不能,基本上@ModelAttribute方法上的注释不能与@ModelAttribute参数上的注释结合使用。我也强烈反对它。它使您的控制器对更改非常脆弱并且容易出错(恕我直言)。

为什么不简单地编写一个返回 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);
    }
} 

不依赖于方法排序的强大解决方案。

于 2013-09-13T10:26:07.790 回答
0

此功能被视为一项改进,最新版本的 spring 框架支持 @ModelAttribute 注解方法的相互依赖。

有关更多信息,请参阅此提交

于 2015-06-23T11:38:29.943 回答