代码之家  ›  专栏  ›  技术社区  ›  Brian Kent

以编程方式调用@controller

  •  4
  • Brian Kent  · 技术社区  · 16 年前

    我正在转换代码,该代码使用SpringMVC控制器的实现来使用注解原型@controller。除了一个问题,一切都很顺利:

    给定一个请求/响应,如何以编程方式处理基于注释的控制器的请求?

    以前,(不管实现如何)我可以打电话给:

    controller.handleRequest(request, response)
    

    与注释等价的是什么?我以为会有一些(也许是静态的?)公用事业类:

    SpringAnnotationBasedControllerUtils.handleRequest(<? extends @Controller> handlerObject, HttpServletRequest request, HttpServletResponse response);
    

    处理将请求映射到@controller原型所允许的动态签名的详细信息,但我找不到这样的内容。

    有什么建议吗?

    (请不要评论为什么这是一个坏主意,或者对于“好”的设计是不必要的,等等。这是正在维护的代码,必须尽可能地无创,因此此时不能选择完全重写。)

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  3
  •   skaffman    16 年前

    只需调用对象上的方法。这是注释驱动控制器的一大好处,您可以只编写代码所需的方法,而无需弯曲变形以符合接口。所以只需将控制器bean连接到代码中,然后直接调用该方法。

    或者你是说你想重新发明一种机制,通过这种机制,Spring将请求映射到带注释的控制器上?如果是这样,请看一下弹簧的来源 AnnotationMethodHandlerAdapter DefaultAnnotationHandlerMapping 类。它很复杂,虽然带有注释的控制器使编写控制器变得更容易,但是底层机制并不令人满意。

        2
  •  2
  •   waxwing    16 年前

    春天有一种叫做 HandlerAdapter 它接受一个请求和一个控制器实现并调用它。这允许在Spring中重用其他框架中的控制器。你想要 AnnotationMethodHandlerAdapter . 我相信你可以自己举例说明:

    HandlerAdapter adapter = new AnnotationMethodHandlerAdapter();
    ModelAndView modelAndView = adapter.handle(request, response, controller);
    

    我也做过类似的事情——但我不确定我是否遗漏了一些重要的东西。

        3
  •  0
  •       16 年前

    你可以引入你自己的接口,让这种通用的句柄行为很容易实现——尽管有重写的可能——你打算用编程的方式做什么?例如,什么类型的决策树——内置的参数映射相当灵活。