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

问题起因

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

后台报的错误是这样的:

××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 中,使用重名名就可以了

如 下例子:

test.controller.bill.BillSaveController
package test.controller.bill;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by liuch on 5/27/15.
 */
@Controller
@RequestMapping("/billsave")
public class BillSaveController {

    @RequestMapping("/dosave")
    public String saveBill(){

        return "billsave";
    }

}

及 test.controller.bill.BillSaveController

package test.controller.billsave;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by liuch on 5/27/15.
 */
@Controller
@RequestMapping("/billsave_test")
public class BillSaveController {

    @RequestMapping("/test")
    public String test(){
        return "test";
    }

}

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

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

SEVERE: Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: 

Unexpected exception parsing XML document from ServletContext resource
[/WEB-INF/dispatcher-servlet.xml]; 

nested exception is java.lang.IllegalStateException: 

Annotation-specified bean name ‘billSaveController‘ for
bean class [test.controller.billsave.BillSaveController]
conflicts with existing, non-compatible bean definition of same name
and class [test.controller.bill.BillSaveController]

问题原因:

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

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

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

解决的办法:

在@Controller上使用名称

如:test.controller.bill.BillSaveController中

package test.controller.bill;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by liuch on 5/27/15.
 */
@Controller("testbillsave")
@RequestMapping("/billsave")
public class BillSaveController {

    @RequestMapping("/dosave")
    public String saveBill(){

        return "billsave";
    }

}
test.controller.billsave.BillSaveController中,使用:
package test.controller.billsave;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * Created by liuch on 5/27/15.
 */
@Controller("realbillsave")
@RequestMapping("/billsave_test")
public class BillSaveController {

    @RequestMapping("/test")
    public String test(){
        return "test";
    }

}

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

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

后记:

下午让同事试了一下,果然可以了。

时间: 2024-10-11 10:35:16

SpringMVC conflicts with existing, non-compatible bean definition of same name and class 的解决办法的相关文章

springMVC+Mybatis(使用AbstractRoutingDataSource实现多数据源切换时)事务管理未生效的解决办法

业务场景: A.B两个单位,系统部署同一套代码: A.B两系统能相互访问: 要求将数据从A系统同步到B系统,再将反馈信息回发给A: 实际开发情况: 因为系统比较小,最开始设计架构的时候没有考虑到消息互通的方式,也没有设计分布式部署,所以采用AbstractRoutingDataSource灵活切换数据源的方式直接在业务代码中实现数据交互. 项目代码: applicationContext-common.xml: <?xml version="1.0" encoding="

spring项目报org.apache.tiles.definition.DefinitionsFactoryException: I/O错误原因及解决办法。

今天升级一个spring项目遇到如下错: HTTP Status 500 - Request processing failed; nested exception is org.apache.tiles.definition.DefinitionsFactoryException: I/O Error reading definitions. org.springframework.web.util.NestedServletException: Request processing fail

复现一个典型的线上Spring Bean对象的线程安全问题(附三种解决办法)

问题复现 假设线上是一个典型的Spring Boot Web项目,某一块业务的处理逻辑为: 接受一个name字符串参数,然后将该值赋予给一个注入的bean对象,修改bean对象的name属性后再返回,期间我们用了 Thread.sleep(300) 来模拟线上的高耗时业务 代码如下: @RestController @RequestMapping("name") public class NameController { @Autowired private NameService n

Annotation-specified bean name &#39;userDaoImpl&#39; for bean class [***] conflicts with existing, non-compatible bean definition of same name and class [***]

使用Spring开发的时候报错如下: Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'userDaoImpl' for bean class [cn.arebirth.impl.UserDaoImpl] conflicts with existing, non-compatible bean definitio

springboot集成redis 报错@Bean definition illegally overridden by existing bean [email&#160;protected]定义被现有bean定义非法重写

在做springboot集成redis时报如下错误: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'cacheManager' defined in class path resource [org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration.class]: @

【spring】non-compatible bean definition of same name and class

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected excep tion parsing XML document from file [F:\java6\idear2010\idear2010\WEB-INF\classe s\applicationContext.xml]; nested exception is java.lang.IllegalStateException: Annotati

解决:Could not resolve bean definition resource pattern [/WEB-INF/classes/spring/applicationContext-*.xml]

问题: 用Maven搭建spring.springmvc.mybatis时,运行报错: org.springframework.beans.factory.BeanDefinitionStoreException: Could not resolve bean definition resource pattern [classpath:spring/applicationContext-*.xml]; nested exception is java.io.FileNotFoundExcept

Spring - Bean Definition Inheritance

A bean definition can contain a lot of configuration information, including constructor arguments, property values, and container-specific information such as initialization method, static factory method name, and so on. A child bean definition inher

Spring错误——Spring 注解——factory-bean reference points back to the same bean definition

背景:学习Spring,在使用注解@Bean的name属性配置<bean>实例时,不能注册实例成功 报错 WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'config