我执行重构并将控制器拆分为 2 个控制器:
@RequestMapping(value = "/graph.htm", method = RequestMethod.POST, params="first")
在第一个控制器中,并且:
@RequestMapping(value = "/graph.htm", method = RequestMethod.POST, params="second")
在第二个控制器中,因此这些注释位于不同的文件中。当我构建和使用项目时,一切都很好(我在表单中输入了不同名称的 HTML 标签:first和second)。
但是当我尝试运行 JUnit 控制器测试时:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:test-context.xml" })
我得到跟踪:
引起:java.lang.IllegalStateException:无法映射处理程序'firstController' 到 URL 路径 [/graph.htm]:已经有处理程序 类型 [class com.web.controller.SecondController] 映射。 在 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:294) 在 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:266) 在 org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.detectHandlers(AbstractDetectingUrlHandlerMapping.java:82) 在 org.springframework.web.servlet.handler.AbstractDetectingUrlHandlerMapping.initApplicationContext(AbstractDetectingUrlHandlerMapping.java:58) 在 org.springframework.context.support.ApplicationObjectSupport.initApplicationContext(ApplicationObjectSupport.java:119) 在 org.springframework.web.context.support.WebApplicationObjectSupport.initApplicationContext(WebApplicationObjectSupport.java:72) 在 org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73) 在 org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:117) 在 org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:92) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:399) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
当我注释掉这个时:
@RequestMapping(value = "/graph.htm", method = RequestMethod.POST, params="second")
在第二个控制器中,第一个控制器的单独测试成功完成。
要解决此问题,我可能会使用不同的 URL(@RequestMapping中的值),但我不明白为什么在我的应用程序的生产构建中为参数解析请求映射并因SpringJUnit4ClassRunner失败。
欢迎任何帮助!
附言。我使用 Spring 3.2。
聚苯乙烯。我发现几乎相同的问题我可以在不同的 Spring 控制器中使用不同的参数具有相同的映射值吗?但根据答案,我的生产构建也必须失败?!但我成功运行生产构建!
另请参阅:
*PPS。
我查看 3.2 的官方文档:
在 Servlet 环境中,参数映射被视为限制 在类型级别强制执行。主路径映射(即 指定的 URI 值)仍然必须唯一标识目标处理程序,其中 参数映射仅表示调用处理程序的先决条件。
所以似乎我执行了非法编码练习......