Я не уверен, возможно ли это в Spring MVC 3.0, но я пытаюсь создать аннотированный контроллер, который расширяет другой контроллер и чьи атрибуты модели зависят от атрибута модели, установленного родителем. Например:
@Controller
public abstract class ParentModel {
@ModelAttribute("numbers")
protected List<Integer> getNumbers() {
return Arrays.asList(new Integer(1));
}
}
@Controller
public abstract class ChildModel extends ParentModel {
@ModelAttribute("number")
protected Integer getNumber(@ModelAttribute("numbers") List<Integer> numbers) {
return numbers.get(0);
}
}
@Controller
public class RequestHandler extends ChildModel {
@RequestMapping("/number")
public String items(@ModelAttribute("number") Integer number) {
return "number"; // number.jsp
}
}
Пока я не смог заставить это работать - выдает следующее исключение:
Ошибка обработки запроса; вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса бина [java.util.List]: указанный класс является интерфейсом] с коренной причиной
org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса бина [java.util.List]: указанный класс является интерфейсом
в org.springframework.beans.BeanUtils.instantiateClass (BeanUtils.java:101)
в org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute (HandlerMethodInvoker.java:762) ... и т. д. *
Когда зависимость от атрибута, установленного родителем, удаляется из ChildModel.getNumber () (путем удаления параметра @ModelAttribute("numbers") List<Integer> numbers
), вызываются оба метода атрибута модели. Однако ParentModel.getNumbers () всегда вызывается перед ChildModel.getNumber ().
Пожалуйста, дайте мне знать, если я что-то упустил, чтобы это полностью заработало или что это просто невозможно.
Заранее спасибо!
EDIT:
После дополнительных экспериментов кажется, что наличие атрибутов модели, зависящих от других атрибутов модели, вероятно, не поддерживается. Я поместил оба метода атрибута модели в ParentModel, и он в лучшем случае работает спорадически ... Спорадическое поведение, вероятно, связано с порядком, в котором методы возвращаются отражением. Когда ParentModel.getNumbers () вызывается до ChildModel.getNumber () (желаемый порядок), он работает правильно. Обнаружив это, я задаю следующий вопрос: Есть ли способ указать порядок, в котором вызываются методы атрибутов модели?