我有一个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

java controller 继承_java – Spring RestController中的继承相关推荐

  1. java 从一个容器获取对象,Java 如何实现从spring容器中获取注入的bean对象

    Java 如何实现从spring容器中获取注入的bean对象 发布时间:2020-11-03 15:27:37 来源:亿速云 阅读:70 作者:Leah 这期内容当中小编将会给大家带来有关Java 如 ...

  2. java 代码通用结构_java spring代码通用结构-java

    src.main. java.com.company.projectname | - aop:类组.Spring AOP的Aspect仓库,是AOP的相关内容.定义了AOP切面类与织入方法.涉及@As ...

  3. Java笔记-Log4j在Spring Boot中的使用

    在Java企业级开发中都需要日志记录相关的操作. Maven相关配置如下,首先要去除Spring Boot自带的日志,然后添加log4j2的日志: <dependency><grou ...

  4. java调用r实例,Spring Boot中使用RSocket的示例代码

    1. 概述 RSocket 应用层协议支持Reactive Streams 语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket 用在spring boot ...

  5. java为什么不能多继承_java为什么不支持多继承

    概述 多重继承是面向对象概念的一个特性,其中一个类可以继承多个父类的属性.当超类和子类中都存在具有相同签名的方法时,就会出现问题.在调用该方法时,编译器无法确定要调用哪个类方法,甚至在调用哪个类方法时 ...

  6. java 嵌套排序_java – Spring数据:按嵌套属性排序

    我正在使用Spring Data中的JpaRepository和JpaSpecificationExecutor,我有一个问题是对方法findAll(规范,可分页,排序)进行排序 我想通过主repo类 ...

  7. java 封装 英文_java类的封装、继承、多态

    一.封装(encapsulation) 封装性就是把类(对象)的属性和行为结合成一个独立的相同单位,并尽可能隐蔽类(对象)的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系.封装的特 ...

  8. java @around_正确理解Spring AOP中的Around advice

    Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before ad ...

  9. java SE 费用_Java SE 6中的垃圾回收器G1收费是虚惊一场

    [51CTO快译]在Sun宣布Java SE 6 update 14版本中的垃圾回收器G1将收费之后,引起了Java社区相当大的反响.之后不久的6月5日,有一个细心的匿名读者发表了这样一个帖子: &q ...

最新文章

  1. 有没有记录程序运行中所有的函数调用堆栈的工具?
  2. JavaScript跨域方法
  3. Port Forwarding Port Triggering
  4. 450. 删除二叉搜索树中的节点
  5. python调用ipython_在IPython中执行Python程序文件的示例
  6. Kibana停止kibana的方法命令:找到5601端口对应的进程ID 把此进程进行kill即可
  7. Oracle入门(八)之权限
  8. java线程6种状态转换,Java线程的生命周期和各种状态转换详解
  9. 内网穿透从搭建到溯源(内网隧道搭建、绕过、隧道流量分析、日志分析、隧道防护)
  10. 美团点评架构再调整,王兴凭什么同时杠上阿里滴滴饿了么
  11. springBoot整合Dubbo使用与采坑
  12. 我滴个乖乖,一万三千颗卫星那
  13. 关于TOGAF认证考试
  14. 浅谈 Android Dex 文件
  15. 阿里云ace考试有什么用?想要通过需要掌握哪些方面知识?
  16. vue 富文本编辑器提取纯文字
  17. 通过 BTC 联动程度判断牛熊
  18. 常见的HTML标签,让你的网页更加精彩
  19. 关于5G通信技术,你了解多少?
  20. python爬虫 豆瓣电影

热门文章

  1. Great Cow BASIC (大母牛BASIC)一个开源的8位芯片PIC和Atmel AVR微控制器的BASIC编译器
  2. 大数据 memcache缓存序列化太慢策略
  3. MrDoc的excel文件导入(Luckysheet)空白行问题问题
  4. ManytoMany字段增删改查Django
  5. 计算机能识别用户的物理身份,(完整版)劳顿管理信息系统习题集-第8章信息系统安全...
  6. springboot整合freemarker出现空指针异常的解决办法
  7. IDEA完成登录servlet功能(连接云数据库)
  8. 纪念我的iriver T7
  9. 高层次人才需求旺盛!2022年中国大数据产业发展趋势
  10. PHP火车购票系统,PHPC6051 火车售票系统