Наследование атрибутов модели Spring MVC 3.0 - PullRequest
0 голосов
/ 27 сентября 2011

Я не уверен, возможно ли это в 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 () (желаемый порядок), он работает правильно. Обнаружив это, я задаю следующий вопрос: Есть ли способ указать порядок, в котором вызываются методы атрибутов модели?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Spring жалуется, потому что не может создать экземпляр List, который является интерфейсом, попробуйте объявить его как ArrayList (или LinkedList ), которые оба являются реализациями интерфейса List.

2 голосов
/ 02 ноября 2011

Возможно, я неправильно использую атрибуты модели Spring. Один из способов добавления атрибута в модель и его повторного использования - второй (зависимый) метод добавить их обоих в модель, например ::10000

public abstract class ParentModel {

    // no longer annotated as model attribute
    // adds the attribute to the model if it does not exist
    protected List<Integer> getNumbers(Model model) {
        List<Integer> numbers = (List<Integer>) model.asMap().get("numbers");
        if (numbers == null) {
            numbers = Arrays.asList(new Integer(1));
            model.addAttribute("numbers", numbers);
        }
        return numbers;
    }

}

@Controller
public abstract class ChildModel extends ParentModel {

    @ModelAttribute("number")
    protected Integer getNumber(Model model) {
        return getNumbers(model).get(0);
    }

}

Я не уверен, что это хороший способ спроектировать Spring MVC, унаследовавший контроллеры, заполняющие модели, но сейчас это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...