【发布时间】: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