java – Spring RestController中的继承
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Spring RestController中的继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4786字,纯文字阅读大概需要7分钟。
内容图文
![java – Spring RestController中的继承](/upload/InfoBanner/zyjiaocheng/809/5d6835d5f1b14d1d9eb60dcd57f22cd6.jpg)
我有一个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") //<-- that's the name of the Spring bean
@RequestMapping("v1/someResource")
public class Controller_V1
@RestController("controller_V1") //<-- that's the name of the Spring bean
@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 – Spring RestController中的继承全部内容,希望文章能够帮你解决java – Spring RestController中的继承所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。