gpt4 book ai didi

java - Spring GET 和 POST 映射在不同的类中

转载 作者:行者123 更新时间:2023-12-02 11:38:22 25 4
gpt4 key购买 nike

我们正在尝试将 Spring Controller 中的 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 双重映射问题的方法。

最佳答案

查看将 URL 路由到 Controller(实际上是 HandlerAdapter 接口(interface))的 DispatcherServlet 的设计和代码,这似乎当然是可能的,但并不容易,而且不是通过现有的 HandlerMapping 类实现的(查看在 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerMapping.html 处实现此接口(interface)的现有类) )。您必须编写一个 HandlerMapping 类(现有处理程序映射的代码可以指导您完成此操作),它将根据 URL 和 HTTP 方法返回正确的 Controller 并对其进行配置(此链接应该有助于 HandlerMapping 配置: http://www.baeldung.com/spring-handler-mappings )。当前的 HandlerMapping 类在为 URL 选择 Controller 时都不考虑 HTTP 方法。

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

关于java - Spring GET 和 POST 映射在不同的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com