以编程方式调用@Controller

时间:2009-08-24 20:09:00

标签: java spring spring-mvc

我正在转换使用Spring MVC的Controller实现的代码来使用注释构造型@Controller。除了一个问题外,一切都很顺利:

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

以前,(无论实施情况如何)我都可以致电:

controller.handleRequest(request, response)

与注释相同的是什么?我曾假设会有一些(可能是静态的)实用程序类:

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

处理将请求映射到@Controller构造型允许的动态签名的细节,但我找不到这样的东西。

有什么建议吗?

(请不要评论为什么这是一个坏主意或者对于“好”的设计应该是不必要的等等。这是维护中的代码,必须尽可能无创,所以完全重写不是一个选项这一次。)

谢谢!

3 个答案:

答案 0 :(得分:3)

您只需在对象上调用方法即可。这是注释驱动控制器的一大优势,您可以只编写代码所需的方法,而不必将形状变形以符合接口。所以只需将控制器bean连接到代码中,然后直接调用该方法。

或者你是说你想重新发明Spring将请求映射到注释控制器的机制?如果是这样,请查看Spring的AnnotationMethodHandlerAdapterDefaultAnnotationHandlerMapping类的源代码。但它很复杂 - 注释控制器使编写控制器变得更容易,但底层机制令人不快。

答案 1 :(得分:2)

Spring有一个名为HandlerAdapter的东西,它接受请求和控制器实现并调用它。这是为了允许其他框架中的控制器在Spring中重用。你想要AnnotationMethodHandlerAdapter。我相信你可以自己实例化这个:

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

我自己也做了类似的事情 - 但我不确定我是不是要留下一些必要的东西。

答案 2 :(得分:0)

您可以引入自己的界面以轻松实现这种通用句柄行为 - 虽然重写但是 - 您希望以编程方式执行什么操作?例如什么样的决策树 - 内置参数映射相当灵活。