我有一个Spring RestController,它处理API调用的第1版.
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)
解决方法:
堆栈跟踪的第一行显然存在问题:
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]
这是因为你让Spring为你的bean命名.默认情况下,Spring将使用bean名称作为camelCase中当前类的接口名称或超类.
所以,你有这样的东西(Spring给出的名字):
@RestController("controller_V1") //
@RequestMapping("v1/someResource")
public class Controller_V1
@RestController("controller_V1") //
@RequestMapping("v2/someResource")
public class Controller_V2 extends Controller_V1
如您所见,您只需要重命名第二个bean:
@RestController("controller_V2")
@RequestMapping("v2/someResource")
public class Controller_V2 extends Controller_V1
IMO你应该为你的班级使用更好的名字.
标签:java,rest,spring
来源: https://codeday.me/bug/20190609/1202921.html