【问题标题】:Spring GET and POST mappings in separate classesSpring GET 和 POST 映射在不同的类中
【发布时间】:2018-02-12 21:35:46
【问题描述】:

我们试图将 Spring 控制器中的 GET 和 POST @RequestMapping 方法分成两个单独的类。

原因是我们希望 POST 调用有一个异常处理程序,它将响应序列化为 JSON 负载,而 GET 调用应该通过 Spring 堆栈冒泡。

但是,当我们尝试将它们分开时,我们会收到错误消息,提示映射被注册了两次:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0' defined in OSGi resource[classpath:/dispatcher-servlet.xml|bnd.id=21|bnd.sym=com.company.application]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler 'settingsController' to URL path [/settings.html]: There is already handler of type [class com.company.application.controller.SettingsModelAndViewController$$EnhancerBySpringCGLIB$$54324809] mapped.

是否可以将 GET 和 POST 请求映射分成两个不同的类?基本上我们想要(请原谅伪命名约定):

class PostHandler {
    @ExceptionHandler
    public void handleException(...) { // Serialize to JSON }

    @RequestMapping(value = "/settings.html", method = RequestMethod.POST)
    public void saveChanges() { ... }
}

class GetHandler {
    @RequestMapping(value = "/settings.html", method = RequestMethod.GET)
    public ModelAndView getSettings() { ... }
}

但目前无法找到解决 Spring 的双重映射投诉的方法。

【问题讨论】:

  • 更好的选择是在不同的类(比如服务类)中执行大部分的 GET 和 POST 逻辑 - 并从请求处理程序进行单线调用以调用服务类来处理请求。
  • 大部分逻辑要么已经重构,要么没有共享。分离的原因归结为我们希望根据我们是呈现 JSP 还是处理传入的 POST 请求来不同地处理 错误。在一种情况下,我们希望重定向到错误页面,在另一种情况下,我们希望通过 JSON 将异常序列化。

标签: java spring spring-mvc http request-mapping


【解决方案1】:

查看将 URL 路由到 Controller(实际上是 HandlerAdapter 接口)的 DispatcherServlet 的设计和代码,这似乎确实可行,但并不容易,而且现有的 HandlerMapping 类也不是这样(查看实现此接口的现有类@ 987654321@)。您必须编写一个 HandlerMapping 类(现有的处理程序映射的代码可以指导您),它将根据 URL 和 HTTP 方法返回正确的控制器并配置它(此链接应该有助于 HandlerMapping 配置:http://www.baeldung.com/spring-handler-mappings) .在为 URL 选择控制器时,当前的 HandlerMapping 类都不会查看 HTTP 方法。

您可以调整 GET 和 POST 请求映射,方法是向其中一个 HTTP 方法处理程序(例如 How do I set priority on Spring MVC mapping?)添加通配符,但不能在 2 个不同的控制器中使用完全相同的 URL。

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2021-04-29
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多