mybatis配置通用dao和service时出现org.springframework.beans.factory.BeanCreationException异常

本来项目是没有通用dao和service的,但是在网上的资料过后,觉得有时候通用类能节省更多编程时间,不用再去写一些简单的重复代码。

但是,在配置完成后,出现了以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'menuController': 

Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'userService': Injection of resource dependencies failed; 
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [com.xbsj.web.common.BaseMapper] is defined: 

 expected single matching bean but found 2: baseMapper,userMapper


第一步,我去把menuController里面的

@Controller
@RequestMapping("/menu")
public class MenuController {
	@Resource
	private UserService userService;
	
	@RequestMapping("/menu")
	public String login(User user) {
		
		return "menu/admin";
	}

@Resource
	private UserService userService;
删了,发现还是报错。

第二步,我去把

@Service
@Transactional
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User, Integer> implements UserService {

中的继承extends BaseServiceImpl<UserMapper, User, Integer>删了,发现还是报错。

第三步,我找到了BaseServiceImpl,把

Service
@Transactional
public class BaseServiceImpl<Mapper extends BaseMapper<T, ID>, T extends BaseObject, ID extends Serializable> implements BaseService<Mapper, T,ID> {
	
	@Resource
	private Mapper mapper;

	@Override
	public int add(T clazz) {
		// TODO Auto-generated method stub
		
		return mapper.add(clazz);
	}


里面的@Resource删掉了,程序终于跑通了,但是你会发现这时候你使用baseMapper里面定义的方法的时候,就会报空指针了,,,

至此,可以发现,时因为使用了两个@Resource注解,导致创建了baseMapper和userMapper两个mapper。

网上看了几篇配置通用dao和service的文章,最后终于解决问题。

解决问题的关键就是将创建baseMapper对象时,将它创建为userMapper对象。

第一种修改方式:

baseServicImpl:

@Service
@Transactional
public abstract class BaseServiceImpl<Mapper extends BaseMapper<T, ID>, T extends BaseObject, ID extends Serializable> implements BaseService< T,ID> {
	
	
	private abstract Mapper mapper;
	public void setMapper(Mapper mapper){
		this.mapper=mapper;
	}


userServiceImpl:

@Service
@Transactional
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User, Integer> implements UserService {
	@Resource
	private UserMapper userMapper;
	@Autowired
	  public void setBaseMapper(){
	    super.setBaseMapper(userMapper);
	  }


第二种修改方式:

baseServiceImpl:

@Service
@Transactional
public abstract class BaseServiceImpl<Mapper extends BaseMapper<T, ID>, T extends BaseObject, ID extends Serializable> implements BaseService< T,ID> {
	
	
	public abstract Mapper getMapper();
	
	@Override
	public int add(T clazz) {
		
		
		return getMapper().add(clazz);
	}


userServiceImpl:

@Service
@Transactional
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User, Integer> implements UserService {
	@Resource
	private UserMapper userMapper;

	@Override
	public UserMapper getMapper() {
		
		return userMapper;
	}


最后,程序也能跑通了,问题也完美解决了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值