`
guochunyang2004
  • 浏览: 80282 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SpringMVC Controller命名冲突的问题

 
阅读更多

SpringMVC conflicts with existing, non-compatible bean definition of same name and class 的解决办法,springmvc获取bean


问题起因

最近,项目组的里的同事遇到一个问题,他自己负责的模块,SpringMVC的Controller与其他模块的Controller 类名重名了,导致整个工程都起不来了。

后台报的错误是这样的:

  1. ××Controller'forbeanclass[××ontroller]conflictswithexisting,non-compatiblebeandefinitionofsamenameandclass

午饭时,他一直和我抱怨这个问题,还说找不到办法。

后面我想了一下,SpringMVC的Controller 应该是采用类似键值对(key/value)的映射方式处理的。而当中的键,默认是用cotroller的类名(非全类名)作为键。这样,如果不同包下面的两个Contoller 重名的话,就会导致SpringMVC的容器管理中的controller map中的key重复了。

解决这个问题也比较简单。

在@Controller 中,使用重名名就可以了

如 下例子:
  1. test.controller.bill.BillSaveController
  2. packagetest.controller.bill;
  3. importorg.springframework.stereotype.Controller;
  4. importorg.springframework.web.bind.annotation.RequestMapping;
  5. /**
  6. *Createdbyliuchon5/27/15.
  7. */
  8. @Controller
  9. @RequestMapping("/billsave")
  10. publicclassBillSaveController{
  11. @RequestMapping("/dosave")
  12. publicStringsaveBill(){
  13. return"billsave";
  14. }
  15. }
及 test.controller.bill.BillSaveController
  1. packagetest.controller.billsave;
  2. importorg.springframework.stereotype.Controller;
  3. importorg.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. *Createdbyliuchon5/27/15.
  6. */
  7. @Controller
  8. @RequestMapping("/billsave_test")
  9. publicclassBillSaveController{
  10. @RequestMapping("/test")
  11. publicStringtest(){
  12. return"test";
  13. }
  14. }

上面这两个代码虽然在不同的包下面,即全类名不同,但是类名却是相同。

这样,在Tomcat 启动的时候,后台会报错:

  1. SEVERE:Contextinitializationfailed
  2. org.springframework.beans.factory.BeanDefinitionStoreException:
  3. UnexpectedexceptionparsingXMLdocumentfromServletContextresource
  4. [/WEB-INF/dispatcher-servlet.xml];
  5. nestedexceptionisjava.lang.IllegalStateException:
  6. Annotation-specifiedbeanname'billSaveController'for
  7. beanclass[test.controller.billsave.BillSaveController]
  8. conflictswithexisting,non-compatiblebeandefinitionofsamename
  9. andclass[test.controller.bill.BillSaveController]

问题原因:

因为如果在使用注解 @Controller 时候,如果不使用命名,而SpringMVC会默认把类名的头一个字母小写,然后放到一个map中。

比如上面的例子,尽管上面两个类全类名不同,但是他们使用了@Controller 注解的时候,都没有使用命名。在SpringMVC在扫描Controller的时候,会把他们都默认解析为 billSaveController.然后以这个billSaveController为键(key), 放到一个全局的map中。

这样,就会出现两个键完全一样的Controller。由于SpringMVC不使用覆盖的方式处理具有相同键的不同全类名的Controller,、扫描的时候就会包上面的错误。

解决的办法:

在@Controller上使用名称

如:test.controller.bill.BillSaveController中

  1. packagetest.controller.bill;
  2. importorg.springframework.stereotype.Controller;
  3. importorg.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. *Createdbyliuchon5/27/15.
  6. */
  7. @Controller("testbillsave")
  8. @RequestMapping("/billsave")
  9. publicclassBillSaveController{
  10. @RequestMapping("/dosave")
  11. publicStringsaveBill(){
  12. return"billsave";
  13. }
  14. }

test.controller.billsave.BillSaveController中,使用:
  1. packagetest.controller.billsave;
  2. importorg.springframework.stereotype.Controller;
  3. importorg.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. *Createdbyliuchon5/27/15.
  6. */
  7. @Controller("realbillsave")
  8. @RequestMapping("/billsave_test")
  9. publicclassBillSaveController{
  10. @RequestMapping("/test")
  11. publicStringtest(){
  12. return"test";
  13. }
  14. }

上面两个Controller中,只要保证一个有命名即可,但是最好两个都使用上。

这是一种良好的编程方式,因为你无法保证其他人不会使用和你一样的类名的Controller。


转载自:http://www.bkjia.com/Javabc/1007408.html
分享到:
评论

相关推荐

    SpringMVC 跨服务器文件上传

    3. 唯一文件命名:避免文件重名冲突。 4. 权限控制:确保只有授权用户可以进行文件上传。 5. 上传后的验证:检查文件是否成功保存,以及完整性。 在给定的压缩包文件"20170712"中,可能包含了实现上述功能的代码...

    Maven创建Spring+SpringMvc+MyBatis包含网上常见问题解答

    1. **依赖冲突**:由于每个库可能有多个版本,可能会导致依赖冲突。解决方法是使用Maven的 `<dependencyManagement>` 标签来统一管理版本。 2. **配置错误**:如Spring或Spring MVC的配置文件中的XML标签拼写错误、...

    springMVC框架下plUpload断点续传

    3. 文件命名策略:为了避免文件重名冲突,可以生成唯一的文件名或使用哈希值。 4. 存储位置:文件应存储在安全目录,防止直接通过URL访问。 五、优化与扩展 1. 上传进度:前端可以通过plUpload的事件监听功能实时...

    Maven + SpringMVC + Mybatis【绝非原创,单纯整理】【五】

    Maven的依赖管理机制使得开发者能够方便地引用和管理项目所需的外部库,避免了版本冲突问题。 接着,SpringMVC是Spring框架的一部分,用于构建Web应用程序的模型-视图-控制器(MVC)架构。它提供了一种声明式的方式...

    SpringMVC+Spring+Mybatis框架配置详细步骤(eclipse普通版).pdf

    4. **测试验证**:编写一个简单的Controller,通过Service调用DAO进行数据库操作,然后设置一个视图返回结果,通过浏览器访问来验证整个配置是否成功。 5. **注意事项**:在配置过程中,要确保各个配置文件的正确性...

    spring mvc核心包(包含文件上传)

    - 存储上传文件时,使用随机或哈希命名,避免文件名冲突和路径遍历攻击。 综上所述,Spring MVC的核心包提供了实现文件上传所需的一切,包括依赖的Apache Commons库。开发者可以通过这些组件轻松地在应用程序中...

    maven搭建SSM

    配置项包括自动扫描 @Controller 注解的类、视图解析器(如 InternalResourceViewResolver)以及 JSON 数据处理(如使用 Jackson 或 Gson)。此外,web.xml 文件中需要配置 ContextLoaderListener 和 ...

    SSM图片上传教学一套.rar

    存储时要考虑文件命名规则,避免文件名冲突。 5. **Service层操作**:在业务逻辑层,可能需要对上传的图片进行处理,比如生成缩略图、添加水印等。 6. **持久化文件信息**:为了便于后续访问,通常需要将文件的...

    JSP基于SSM会议室预约系统设计毕业源码案例设计.zip

    本项目源码以"JSP_SSM_Meeting_Room_Appointment-master"命名,旨在实现一个基于SSM的会议室预约系统,适用于毕业设计、课程设计或学习参考。 首先,Spring框架作为核心容器,管理应用的Bean及其依赖关系,实现了...

    基于ssm建筑装修图纸管理平台.zip

    系统需要有上传、下载接口,以及文件的命名、存储路径规划策略,防止文件冲突。 8. **接口设计与API调用**:后端需要提供RESTful API供微信小程序调用,进行数据交互。这些API可能包括登录注册、图纸列表获取、上传...

    SSM前言1

    这样的分包方式有助于保持代码结构清晰,避免命名冲突,并方便代码组织和维护。 2. **数据封装层的分类**: - **beansentitypo(Persistance Object)**:这类对象通常对应数据库中的表字段,包含id属性,用于持久...

    SpringBoot文件上传

    2. **文件命名策略**:为了避免文件名冲突,可以采用时间戳或随机字符串来重命名上传的文件。 3. **存储路径管理**:确保文件存储路径是安全的,并且不会被恶意访问。可以考虑将文件存储在应用的资源目录之外,或者...

    在SSM框架中实现上传下载的项目,一手操刀编写

    - **文件命名策略**:为了避免文件名冲突,通常会采用时间戳、随机字符串等方式对文件进行重命名。 **3. 文件下载:** - **响应头设置**:为了实现文件下载,需要在HTTP响应头中设置Content-Type、Content-...

    jquery.form.js框架实现文件上传功能案例解析(springmvc)

    4. 文件命名:避免文件名冲突,可能需要重命名上传的文件。 5. 文件存储位置:合理规划文件存储路径,保证文件的安全性和可管理性。 通过以上步骤,我们可以使用jQuery.form.js和Spring MVC构建一个完整的文件上传...

    基于ssm+vue铁岭河医院医患管理系统.zip

    它遵循Model-View-Controller(MVC)设计模式,分离了业务逻辑、数据和用户界面,提高了代码的可维护性和可测试性。 3. MyBatis:是一个持久层框架,它允许开发者将SQL语句与Java代码直接绑定,提供灵活的数据访问...

    appfuse开发框架(myapp)使用说明文档

    - **解析冲突**:当使用JDK 1.5时,如果这两个JAR文件存在,则会导致Tomcat启动时与JDK自带的XML解析器发生冲突。 ##### 1.2 应用程序安装 为了顺利地进行开发,还需要安装并配置以下工具: - **Eclipse 3.3**:...

Global site tag (gtag.js) - Google Analytics