SpringMVC Controller命名冲突的问题

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


问题起因

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

后台报的错误是这样的:

[java]  view plain  copy
  1. ××Controller' for bean class [××ontroller] conflicts with existing, non-compatible bean definition of same name and class   

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

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

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

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

如 下例子:
[java]  view plain  copy
  1. test.controller.bill.BillSaveController  
  2.   
  3. package test.controller.bill;  
  4.   
  5. import org.springframework.stereotype.Controller;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7.   
  8. /** 
  9.  * Created by liuch on 5/27/15. 
  10.  */  
  11. @Controller  
  12. @RequestMapping("/billsave")  
  13. public class BillSaveController {  
  14.   
  15.     @RequestMapping("/dosave")  
  16.     public String saveBill(){  
  17.   
  18.         return "billsave";  
  19.     }  
  20.   
  21. }  
及 test.controller.bill.BillSaveController
[java]  view plain  copy
  1. package test.controller.billsave;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. /** 
  7.  * Created by liuch on 5/27/15. 
  8.  */  
  9. @Controller  
  10. @RequestMapping("/billsave_test")  
  11. public class BillSaveController {  
  12.   
  13.     @RequestMapping("/test")  
  14.     public String test(){  
  15.         return "test";  
  16.     }  
  17.   
  18. }  

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

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

[java]  view plain  copy
  1. SEVERE: Context initialization failed  
  2. org.springframework.beans.factory.BeanDefinitionStoreException:   
  3.   
  4. Unexpected exception parsing XML document from ServletContext resource  
  5. [/WEB-INF/dispatcher-servlet.xml];   
  6.   
  7. nested exception is java.lang.IllegalStateException:   
  8.   
  9. Annotation-specified bean name 'billSaveController' for   
  10. bean class [test.controller.billsave.BillSaveController]   
  11. conflicts with existing, non-compatible bean definition of same name   
  12. and class [test.controller.bill.BillSaveController]  

问题原因:

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

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

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

解决的办法:

在@Controller上使用名称

如:test.controller.bill.BillSaveController中

[java]  view plain  copy
  1. package test.controller.bill;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.   
  6. /** 
  7.  * Created by liuch on 5/27/15. 
  8.  */  
  9. @Controller("testbillsave")  
  10. @RequestMapping("/billsave")  
  11. public class BillSaveController {  
  12.   
  13.     @RequestMapping("/dosave")  
  14.     public String saveBill(){  
  15.   
  16.         return "billsave";  
  17.     }  
  18.   
  19. }  

test.controller.billsave.BillSaveController中,使用:
[java]  view plain  copy
  1. package test.controller.billsave;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. /** 
  6.  * Created by liuch on 5/27/15. 
  7.  */  
  8. @Controller("realbillsave")  
  9. @RequestMapping("/billsave_test")  
  10. public class BillSaveController {  
  11.   
  12.     @RequestMapping("/test")  
  13.     public String test(){  
  14.         return "test";  
  15.     }  
  16.   
  17. }  

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

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


转载自:http://www.bkjia.com/Javabc/1007408.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值