注入服务时出错:UnsatisfiedDependencyException:SystemInjecteeImpl上没有可用于注入的对象

时间:2019-06-07 07:02:23

标签: spring-boot java-8 jersey hk2

我正在尝试在Spring Boot应用程序中注入服务。但是我遇到以下错误:

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=RecommendationService,parent=RecommendationResourceImpl,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1163111460)

代码如下:

package com.example.test.recommendations.resources;    

@Provider
public class RecommendationResourceImpl implements RecommendationResource {

@Inject
private RecommendationService recommendationService;

@Override
public List<Recommendation> get(String currency,
                                String entity) {
    return recommendationService.getRecommendations(currency, entity));
  }
}

服务界面

package com.example.test.recommendations.resources;

// imports

public interface RecommendationService {
    List<Recommendation> getRecommendations(String currency, String entity);

    Recommendation get(UUID uuid);
}

服务实施

package com.example.test.recommendations.resources;

//imports

@Component
public class RecommendationServiceImpl implements RecommendationService{
    @Override
    public List<Recommendation> getRecommendations(String currency, String entity) {
        return Collections.emptyList();
    }

    @Override
    public Recommendation get(UUID uuid) {
        return null;
    }
}

在Spring Boot应用程序中注入服务的正确方法是什么?

我使用的是Spring Boot版本1.3.8和Jersey版本2.25.1

2 个答案:

答案 0 :(得分:0)

从您的堆栈跟踪中可以明显看出,服务器找不到要注入的依赖项Bean,因此请首先检查在应用启动期间是否已为该类创建了所需的Bean。验证服务类是否在组件的类路径中进行扫描,否则包括要扫描的软件包。

您正在使用@Inject批注而不是弹簧@Autowired批注来注入bean。它可以正常工作,但是@Autowired和{{1}之间的第一个也是最重要的区别}注释是@Inject注释仅从Spring 3.0起可用,因此,如果要在Spring 2.5中使用注释驱动的依赖项注入,则必须使用@Inject注释。

第二,对服务层使用注释@Autowired,而不要使用@Service注释。

  

表示带注释的类是最初定义的“服务”   由Domain-Driven Design(Evans,2003)定义为“   接口在模型中独立存在,没有封装状态。”

     

还可能表明某类是“业务服务门面”(在   核心J2EE模式意义)或类似的东西。此注释是一个   通用型刻板印象,个别团队可能会缩小他们的范围   语义和适当使用。

     

此注释用作@Component的特化,允许   可以通过类路径扫描自动检测实现类。

@Component

我不是将jersey与springboot结合使用的专家,所以我不知道是否有任何配置导致此问题。

也许此线程可能对您有更多帮助: Dependency injection with Jersey 2.0

答案 1 :(得分:0)

您可能从未在DI容器中注册过服务。您可以在自己的ResourceConfig中进行此操作,因为您正在使用球衣,所以可能会使用它:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new org.glassfish.hk2.utilities.binding.AbstractBinder() {

            @Override
            protected void configure() {
                bind(RecommendationServiceImpl.class).to(RecommendationService.class).in(Singleton.class);
            }
        });

        packages("com.example.test.recommendations.resources");
    }
}

我正在使用没有spring的hk2,因此通常使用org.jvnet.hk2.annotations.Contract注释我的接口,并使用org.jvnet.hk2.annotations.Service注释实现。 (注意:不是spring @Service注释),所以我建议也尝试这样做。