org.springframework.beans.factory.UnsatisfiedDependencyException,没有[edu.sample.service.ItemService]类型的限定bean

时间:2016-08-26 19:04:24

标签: java spring spring-boot

是春季启动应用程序。我得到以下异常。请解决它,请帮助我     我的Controller类是

import edu.sample.model.Item;
import edu.sample.service.ItemService;

@ComponentScan(basePackages = "edu.*")
@RestController
public class ItemController {

    @Autowired
    @Qualifier(value="itemService")
    private ItemService itemService;

    @RequestMapping(value = "/getAllItems", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<Item>> getAllItems() {
        List<Item> items = itemService.getAllItems();
        return new ResponseEntity<List<Item>>(items, HttpStatus.OK);
    }
}

服务类是

@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    ItemDAO itemDAO;

    @Override
    public String addItem(Item item) {
        return itemDAO.addItem(item);
    }

    @Override
    public String deleteItem(Integer id) {
        return itemDAO.deleteItem(id);
    } 

    @Override
    public void updateItem(Item item) {

    }

    @Override
    public List<Item> getAllItems() {
        return itemDAO.getAllItems();
    }

}

和DAO班

@Resource
public class ItemDAOImpl implements ItemDAO {

    @PersistenceContext
    EntityManager entityManager;

    @Override
    public String addItem(Item item) {
        entityManager.persist(item);
        return item.getName();
    }

    @Override
    public String deleteItem(Integer id) {
        String name=entityManager.find(Item.class, id).getName();
        entityManager.remove(id);
        return name;
    }

    @Override
    public void updateItem(Item item) {

    }

    @Override
    public List<Item> getAllItems() {
        return entityManager.createQuery("from Item").getResultList();
    }

}

我收到此异常消息:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'itemController': Unsatisfied dependency expressed through field 'itemService': No qualifying bean of type [edu.sample.service.ItemService] found for dependency [edu.sample.service.ItemService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=itemService)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [edu.sample.service.ItemService] found for dependency [edu.sample.service.ItemService]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=itemService)}

2 个答案:

答案 0 :(得分:1)

您必须使用您的限定符ItemServiceImpl命名"itemService",如下所示:

@Service("itemService")
public class ItemServiceImpl implements ItemService {
    ...

答案 1 :(得分:1)

默认情况下,spring bean的名称取自itemServiceImpl的{​​{1}}类名称。

使用以下声明,您有一个名为ItemServiceImpl的{​​{1}}类型的bean。

ItemService

但是,由于您正在使用itemServiceImpl,因此您尝试按名称自动装配bean。 @Service public class ItemServiceImpl implements ItemService { /** ... */ } 需要一个名为@Qualifier(value="itemService")的bean,但spring上下文没有带有该名称的bean,因此ItemController

itemService

现在,要解决您的问题,您可以为UnsatisfiedDependencyException bean指定一个明确的名称,如

@ComponentScan(basePackages = "edu.*")
@RestController
public class ItemController {

    @Autowired
    @Qualifier(value="itemService")
    private ItemService itemService;
    /* ... */
}

另一种方法是通过从ItemServiceImpl中删除@Service("itemService") public class ItemServiceImpl implements ItemService { /** ... */ } 注释,让spring通过它的类型而不是名称来自动装配ItemService bean。除非在spring上下文中有多个@Qualifier类型的bean,否则这种方法很好并且很简单。