【发布时间】:2016-01-04 22:20:38
【问题描述】:
我有一个处理 API 调用版本 1 的 Spring RestController。
package rest.v1;
@RestController
@RequestMapping("v1/someResource")
public class Controller_V1 {
@RequestMapping(value = "/{resourceName}", method = RequestMethod.GET)
public Object retrieve() throws Exception {
....
}
}
我想做的是创建另一个处理版本 2 请求的控制器。同时我想继承已经在版本 1 控制器中的实现。这是因为从 v1 到 v2 未更改的实现将只是从 v1 继承。
所以是这样的:
package rest.v2;
@RestController("controllerV2")
@RequestMapping("v2/someResource")
public class Controller_v2 extends Controller_v1 {
@RequestMapping(value = "/{resourceName}", method = RequestMethod.GET)
public Object retrieve() throws Exception {
//implementation overridden from v1
}
}
这样做会导致 ConflictingBeanDefinitionException。我也不确定是否应该像上面那样扩展控制器。
我知道我可以像这样在同一个控制器的 RequestMapping 中使用多个路径:
@RestController
@RequestMapping(value = { "v1/someResource", "v1/someResource" })
public class Controller_V1 {
}
但以上内容不适用于我的场景。
这是扩展控制器时的堆栈跟踪:
[java] org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [rest-context.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'controller_V1' for bean class [rest.v2.Controller_V2] conflicts with existing, non-compatible bean definition of same name and class [rest.v1.Controller_V1]
[java] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:413)
[java] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335)
[java] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
[java] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
[java] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)
[java] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
[java] at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
[java] at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
[java] at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
[java] at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540)
[java] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454)
[java] at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
[java] at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
[java] at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
[java] at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
[java] at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
[java] at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
[java] at javax.servlet.GenericServlet.init(GenericServlet.java:158)
【问题讨论】:
-
请向我们展示您的 XML 配置。