Java Spring MVC无状态到状态切换

时间:2009-09-11 05:46:37

标签: java model-view-controller oop spring

虽然我已将此标记为java / spring问题,但可以轻松地询问任何具有无状态控制器的mvc框架。我知道rails使用简单的无状态控制器,所以也许你们知道如何最好地解决这个问题。我可以用java / spring mvc来描述问题,这是实现 - 请原谅java术语。

问题

我们无法想出一种在spring mvc中执行无状态到状态切换的令人满意的方法。 本质上给出了一个结构:

型号:Unit 状态:撤消,可用,不可用 操作:getOutline()getHelp()

控制器:UnitController 操作:displayOutline()displayHelp()

我们需要一种方法来在执行操作displayOutline()之前检查单元的状态(因为单元本身可能被撤销,因此用户应该转发到撤销页面)。

我们尝试过多种方式,包括:

死亡的简单方式(任何语言)

控制器中需要“可用”状态单元的所有方法在其实现的第一行中调用方法isAvailable()。显然,这里有很多复制,它充满了热情。

AOP方式(特定于Java)

可以创建一个名为UnitAccess的@Around建议,它会检查并重新路由控制流(即不调用proceed(),而是调用它调用控制器上另一个方法的底层方法)。这似乎是一个黑客,而不是真正的AOP,如果它,它确实删除了复制,但增加了复杂性,降低了透明度。

拦截器(由servlet架构提供,但可能在其他框架中可行)

检查单元状态并基本上更改实际的URL调用。这似乎不对。我们不喜欢在到达控制器之前调用模型逻辑的想法。

我们已经考虑了

命令模式

创建一个命令模式结构(使用继承)可以返回撤销视图或有效的displayOutline视图。由于execute方法将执行super()调用中的检查以及具体命令内的特定逻辑。即创建像

这样的对象结构
DisplayOutlineCommand extends UnitCommand

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

最后,使用自定义异常

在返回单元之前,在服务级别对象上调用getAvailableUnit(),该对象将执行可用性检查等。如果单元被撤销,那么它将抛出一个UnitWithdrawnException,它可以被servlet捕获并通过返回适当的视图来处理。仍然不相信。对于正常流量控制使用异常的想法,我们也不热衷。

我们错过了什么吗?在spring /另一个无状态控制器框架下有一个简单的方法吗?

2 个答案:

答案 0 :(得分:1)

也许我错过了这一点,但是如果该单位被撤销,为什么用户会来到控制器?

我认为最好确保正常页面不链接到需要单元为“OK”的控制器,如果该单元不是“OK”。 如果单元的状态在引用页面呈现的时间和实际调用进入控制器之间发生变化(它不再是'OK'),那么使用异常处理该事件对我来说似乎完全没问题(比如发生乐观锁定错误时发生异常)。

答案 1 :(得分:0)

也许你没有描述整个问题,但为什么不把检查放在displayOutline()本身?也许路由到displayOutlineOrHelp()方法,看起来基本上像

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

    return unit.isAvailable() ? displayOutline(...) : displayHelp(...);   
}
相关问题