本来项目是没有通用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;
}
最后,程序也能跑通了,问题也完美解决了。