繁体   English   中英

用guice覆盖球衣资源

[英]Override jersey resource with guice

我正在寻找一种方法来覆盖GuiceServletContextListener中与guice绑定的球衣资源。 我正在尝试的代码:

//Define Jersey resource interface
@Path("/books/{key}")
public interface BookDocument {

    public BookDAO getDao();

    public void setDao(BookDAO dao);
}

//Define default implementation
public class BookImpl implements Book {

    @Override
    public BookDAO getDao() {
        return dao;
    }

    @Inject
    @Override
    public void setDao(BookDAO dao) {
        this.dao = dao;
    }
}

//User wants to inject his implementation, so he define it
public class BookUserImpl implements Book {

    @Override
    public BookDAO getDao() {
        return dao;
    }

    @Inject
    @Override
    public void setDao(BookDAO dao) {
        this.dao = dao;
    }
}

//Inject default implementation of resource
public class ApplicationResourcesModule extends AbstractModule
{
    @Override
    protected void configure()
    {
        bind(Book).to(BookImpl);
    }
}

//But user wants to inject his implementation, so he bind it in users AbstractModule
public class ApplicationResourcesModuleUser extends AbstractModule
{
    @Override
    protected void configure()
    {
        bind(Book).to(BookUserImpl);
    }
}

//Bind all resources
public class JerseyGuiceConfig extends GuiceServletContextListener
{
    @Override
    protected Injector getInjector()
    {
        //Override default binding by user bindings.
        return Guice.createInjector(Modules.override(new ApplicationResourcesModule()).with(new ApplicationResourcesModuleUser()), new JerseyServletModule());
    }
}

但是不幸的是,这是行不通的,尽管我不能像实现接口那样绑定球衣资源,但只能bind(BookImpl.class) 但是这种绑定是不可能覆盖的。 如果我尝试使用bind(BookImpl.class)覆盖bind(BookImpl.class)bind(BookUserImpl.class)收到错误Conflicting URI templates. The URI template /books/{key} for root resource class. Conflicting URI templates. The URI template /books/{key} for root resource class. 而@Path应该是唯一的。 那么我的用例有什么解决方案吗?

我只是不警告您Modules.override在Guice.createInjector(Stage.PRODUCTION,...)上不起作用,因此您应该仅将其谨慎地用于开发。 您应该创建两个上下文侦听器,并以某种方式(可以说是maven配置文件)设置具有正确实现的web.xml。

更好地使用:

//Inject default implementation of resource
public class MainModule extends AbstractModule
{
    @Override
    protected void configure()
    {
        if(currentStage().equals(Stage.PRODUCTION) {
          install(new ApplicationResourcesModuleUser());
        } else {
          install(new ApplicationResourcesModule());
        }
    }
}

//Bind all resources
public class JerseyGuiceConfigPROD extends GuiceServletContextListener
{
    @Override
    protected Injector getInjector()
    {
        //Override default binding by user bindings.
        return Guice.createInjector(Stage.PRODUCTION, new MainModule(), new JerseyServletModule());
    }
}

public class JerseyGuiceConfigDEV extends GuiceServletContextListener
{
    @Override
    protected Injector getInjector()
    {
        //Override default binding by user bindings.
        return Guice.createInjector(Stage.DEVELOPMENT, new MainModule(), new JerseyServletModule());
    }
}

您可以在界面上使用@ImplementedBy批注,以表示默认实现应为。 因此,您不必显式绑定它,而如果您绑定它,它将覆盖注释绑定。

@Path("/books/{key}")
@ImplementedBy(BookImpl.class)
public interface Book {

    public BookDAO getDao();

    @Inject //it is enough to put the injection here, i think
    public void setDao(BookDAO dao);
}

我认为这个问题与Book and Book实现绑定无关,而是与Servlet到Jersey容器的绑定/注册有关。 您能粘贴整个stacktrace吗,guice stacktrace很冗长而且很有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM