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

来源:互联网 发布:c语言共用体union例子 编辑:程序博客网 时间:2024/06/05 03:07

本来项目是没有通用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 {@Resourceprivate UserService userService;@RequestMapping("/menu")public String login(User user) {return "menu/admin";}

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

第二步,我去把

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

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

第三步,我找到了BaseServiceImpl,把

Service@Transactionalpublic class BaseServiceImpl<Mapper extends BaseMapper<T, ID>, T extends BaseObject, ID extends Serializable> implements BaseService<Mapper, T,ID> {@Resourceprivate Mapper mapper;@Overridepublic int add(T clazz) {// TODO Auto-generated method stubreturn mapper.add(clazz);}


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

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

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

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

第一种修改方式:

baseServicImpl:

@Service@Transactionalpublic 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@Transactionalpublic class UserServiceImpl extends BaseServiceImpl<UserMapper, User, Integer> implements UserService {@Resourceprivate UserMapper userMapper;@Autowired  public void setBaseMapper(){    super.setBaseMapper(userMapper);  }


第二种修改方式:

baseServiceImpl:

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


userServiceImpl:

@Service@Transactionalpublic class UserServiceImpl extends BaseServiceImpl<UserMapper, User, Integer> implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic UserMapper getMapper() {return userMapper;}


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


0 0
原创粉丝点击