我正在尝试在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
答案 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注释),所以我建议也尝试这样做。