答案:
非常感谢所有关注此内容的人,尤其是@Andbdrew。根据他的帮助,我的代码可以在https://github.com/dabraham02124/injection/tree/feature上运行。我将看看是否可以减少它的“做魔术的注释”,实际上有代码调用其他代码,但是它在“功能”分支上起作用。
原始问题:
我正在尝试在jersey 2.7应用程序中注入资源。它不起作用。我收到以下错误:
2019-04-20 22:06:06,004警告[qtp1142020464-16] o.e.j.s.ServletHandler- javax.servlet.ServletException:MultiException具有3个异常。他们是: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException:Injectee处没有可用于注入的对象(requiredType = StringHolder,parent = EntryPoint,qualifiers = {}),position = -1,optional = false,self = false,不合格= null,1295211193) 2. java.lang.IllegalArgumentException:尝试解决org.sweatshop.injection.EntryPoint的依赖项时发现错误 3. java.lang.IllegalStateException:无法执行操作:在org.sweatshop.injection.EntryPoint上解析
我已经遵循了所有教程中看到的所有内容,例如但不限于;
我尝试在各个地方添加各种注释,我已经阅读了所有可以找到的stackoverflow页面,但没有看到任何变化。
可以在https://github.com/dabraham02124/injection找到最小的示例。第一次提交没有注入,并且可以正常工作。第二个提交确实具有注入和抛出。
对于那些想在此页面上查看代码的人,我认为的以下几点很重要:
资源类
@Path("/")
@RequestScoped
public class EntryPoint {
@Inject
public StringHolder stringHolder;
@GET
@Produces(MediaType.TEXT_HTML)
public Response homePage() {
return Response.ok(stringHolder.getString()).build();
}
}
应用程序类
@ApplicationPath("/")
public class App extends ResourceConfig {
private final MyServer jettyServer;
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(App.class);
public App(MyServer jettyServer) {
this.jettyServer = jettyServer;
}
public static void main(String[] args) throws Exception {
final ServletContextHandler context = getContext();
final MyServer jettyServer = new MyServer(8080, context);
prepJettyServlet(context);
log.info("about to start up");
new App(jettyServer).runServer();
}
private void register() {
log.info("start register");
register(EntryPoint.class);
register(StringHolder.class);
register(new AbstractBinder() {
@Override
protected void configure() {
log.info("start bind singleton"); //These three lines never get called
bind(new StringHolder("injected string")).to(StringHolder.class);
log.info("end bind singleton");
}
});
log.info("end register");
}
注入的单例课程
@RequestScoped
public class StringHolder {
private final String string;
public StringHolder(String string) {
this.string = string;
}
public String getString() {
return string;
}
}
有趣的是,日志显示了我在活页夹上的调用寄存器,但我从未看到有证据证明正在调用configure
。
有帮助吗?我正在拔头发,已经秃了...
答案 0 :(得分:1)
您可以使用Feature
来完成此操作,如this answer中所述(我无法让他们的第一种方法适合您的球衣版本)。
@Provider
public final class StartupListener implements Feature {
private final ServiceLocator serviceLocator;
@Inject
public StartupListener(ServiceLocator serviceLocator) {
this.serviceLocator = serviceLocator;
}
@Override
public boolean configure(FeatureContext context) {
ServiceLocatorUtilities.bind(serviceLocator, new AbstractBinder() {
@Override
protected void configure() {
bind(new StringHolder("injected string")).to(StringHolder.class);
}
});
return true;
}
}