Передача без сохранения состояния Java Spring MVC - PullRequest
1 голос
/ 11 сентября 2009

Хотя я пометил это как вопрос java / spring, его легко можно задать для любой среды mvc с контроллерами без сохранения состояния. Я знаю, что rails использует простые контроллеры без сохранения состояния, так что, возможно, вы, ребята, знаете, как лучше всего решить эту проблему. Я могу лучше всего описать проблему с Java / Spring MVC, который является реализацией - простите Java Jargon.

Выпуск

У нас возникли проблемы с поиском удовлетворительного способа выполнения передачи состояния без состояния в весенний mvc. В сущности, учитывая структуру, как:

Модель: Unit С состояниями: отозвано, доступно, недоступно И операции: getOutline() и getHelp()

Контроллер: UnitController с операциями: displayOutline() и displayHelp()

Нам нужен способ проверить состояние устройства, прежде чем мы выполним операцию displayOutline() (потому что само устройство может быть отозвано, и поэтому пользователь должен быть перенаправлен на удаленную страницу).

Мы пытались сделать это несколькими способами, включая:

Мертвый простой способ (любой язык)

Все методы в контроллере, для которых требуется «доступный» блок состояния, вызывают метод isAvailable () в первой строке его реализации. Очевидно, что здесь много репликации, она пахнет.

Способ AOP (специфичный для Java)

Может быть создан совет @Around под названием UnitAccess, который выполняет проверку и перенаправляет поток управления (то есть вместо вызова continue (), который вызовет базовый метод, который вызывает другой метод на контроллере). Это похоже на хак и не совсем то, что AOP, если для, он удаляет репликацию, но добавляет сложность и снижает прозрачность.

Перехватчик (предоставляется архитектурой сервлета, но, вероятно, выполнимо в других средах)

Который проверяет состояние устройства и существенно меняет фактический URL-вызов. Опять же это не кажется правильным. Нам не нравится идея вызова логики модели перед тем, как перейти к контроллеру.

Мы думали о

Шаблон команды

Создание структуры шаблона команды, которая (с использованием наследования) может возвращать изъятое представление или действительное представление displayOutline. Поскольку метод execute будет выполнять проверки в вызове super() и конкретной логике внутри конкретных команд. Т.е. создание структуры объекта типа

DisplayOutlineCommand extends UnitCommand

    public void execute(){
        super();
        // must be ok, perform getOutline()
    }

И, наконец, использование пользовательского исключения

Вызов getAvailableUnit() для объекта уровня обслуживания, который будет проверять наличие и т. Д. Перед возвратом устройства. Если юнит отозван, он выдаст исключение UnitWithdrawnException, которое может быть перехвачено сервлетом и обработано путем возврата соответствующего представления. Все еще не были убеждены. Нам также не нравится идея использовать исключение для нормального управления потоком.

Мы что-то упустили? Есть ли простой способ сделать это под пружиной / другой платформой контроллера без сохранения состояния?

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

Может быть, я упускаю суть, но зачем пользователю приходить к контроллеру, если модуль выводится?

Я бы сказал, что лучше всего убедиться, что обычно страницы не ссылаются на контроллер, для которого требуется, чтобы модуль был «в порядке», если этот модуль не «в порядке». Если состояние модуля изменяется между временем рендеринга ссылающейся страницы и фактическим вызовом, поступающим к контроллеру (это больше не «ОК»), тогда использование исключения для обработки этого события мне кажется вполне приемлемым например, иметь исключение, когда возникает оптимистическая ошибка блокировки).

0 голосов
/ 11 сентября 2009

Возможно, вы не описали всю проблему, но почему бы не поставить чек в displayOutline() сам? возможно маршрут к displayOutlineOrHelp() методу, который выглядит по существу как

ModelAndView displayOutlineOrHelp(...)  {
    Unit unit = ... //code to get the unit the request refers to

    return unit.isAvailable() ? displayOutline(...) : displayHelp(...);   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...