球衣注射AbstractBinder没有调用configure

user3742898:

回答:

非常感谢所有关注此内容的人,尤其是@Andbdrew。基于他的帮助,我可以使用它,代码位于https://github.com/dabraham02124/injection/tree/feature我将看看是否可以减少它的“做魔术的注释”,并实际上使代码调用其他代码,但是它正在“功能”分支上工作。


原始问题:

我正在尝试在jersey 2.7应用程序中注入资源。它不起作用。我收到以下错误:

2019-04-20 22:06:06,004警告[qtp1142020464-16] oejsServletHandler-javax.servlet.ServletException:MultiException具有3个异常。它们是:1. org.glassfish.hk2.api.UnsatisfiedDependencyException:Injectee处没有可用于注入的对象(r​​equiredType = StringHolder,parent = EntryPoint,qualifiers = {}),position = -1,optional = false,self = false,unqualified = null,1295211193)2. java.lang.IllegalArgumentException:尝试解决org.sweatshop.injection.EntryPoint错误的依赖性时,发现了3. java.lang.IllegalStateException:无法执行操作:在org上解析。 Shoeshop.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被调用的证据

救命?我正在拔头发,现在已经秃了...

安德鲁(Andbdrew):

您可以Feature按照此答案中的说明使用a 来完成此操作(我无法采用他们的球衣版本的第一种方法)。

@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;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章