【问题标题】:How to set an object to context so that i can get it anywhere in the application with @Context如何将对象设置为上下文,以便我可以使用@Context 在应用程序中的任何位置获取它
【发布时间】:2016-08-16 13:49:21
【问题描述】:

我想将MyObject 类实例设置为应用程序上下文,以便我可以在任何地方使用它:

@Context MyObject object

我使用了Jedis,这使我可以通过上述方法访问jedis。

请帮助设置上下文。

我正在使用dropwizard (jetty,jersery and jackson)。

【问题讨论】:

  • 这听起来像是对上下文的误用。您的 MyObject 实际上是否有任何上下文信息?这听起来更像是一个注入框架的工作
  • 欢迎来到 Stack Overflow!能否在您努力解决问题的同时,在内容中提供更好的标题和更详细的信息?

标签: java rest jetty jersey-2.0 dropwizard


【解决方案1】:

我有一些时间并写下了实现它的方法(仅球衣,没有使用其他 DI 框架)。

Jersey 符合 javax.inject 注释。您不使用上下文注释的原因是因为(听起来)您的 MyObject 类不是上下文对象(例如,它不会随每个请求而改变,例如可注入的 HttpServletRequest)。所以我们需要绑定你的对象。

考虑一下我对 MyObject 的实现:

public class MyObject {

    String get() {
        return "I am an object"; 
    }
}

这个对象需要在我的球衣类(资源、过滤器等)中可用。我用这个 bean 写了一点资源:

@Path("context")
public class ContextResource {

    @Inject
    MyObject o;

    @GET
    public String get() {
        return o.get();
    }

}

请注意,我在这种情况下使用 javax.inject.Inject 注释来告诉 jersey 我想要注入这个特定的 bean。 我现在需要做的就是告诉泽西这个豆子。在我的 DW 应用程序中,我这样做:

public class Application extends io.dropwizard.Application<Configuration>{  

    @Override
    public void run(Configuration configuration, Environment environment) throws Exception {

        environment.jersey().register(ContextResource.class);
        environment.jersey().register(new AbstractBinder() {

            @Override
            protected void configure() {
                bind(MyObject.class).to(MyObject.class);
            }
        });
    }

    public static void main(String[] args) throws Exception {
        new Application().run("server", "/home/artur/dev/repo/sandbox/src/main/resources/config/test.yaml");
    }
}

请注意,我正在使用绑定器来绑定我的 bean。语法看起来很时髦,但本质上它是在做“将类型绑定到实现”。因为我的类型是我的实现(我没有使用 MyObject 的接口),所以看起来像:

bind(MyObject.class).to(MyObject.class) 

现在 jersey 知道我的 bean 并且会很高兴地注入它。

运行我所有的代码打印:

artur@pandaadb:~/dev/vpn$ curl localhost:9085/api/context
I am an object

希望能带来一些关于如何在没有框架的情况下使用注入的见解。就我个人而言,我建议将 guice 与 dropwizard(谷歌:dropwizard-guicey)一起使用,这使得这类事情变得非常容易。

问候,

阿图尔

【讨论】:

  • 我有一个 TestClass 并从资源类初始化它。正如你所说,我在 TestClass 内部注入了,但实例总是为空。但是如果我在 Resource 类中注入它,我就可以访问注入的实例。
  • TestClass 没有被注入,因为它不是 jersey 创建的,它是你创建的。 Jersey 对此一无所知,因此不会注入它。
  • 不,你误会了。我在我的 TestClass 中注入 MyObject 但它始终为空。我无法从 TestClass 访问 MyObject 的成员。
  • 如果要在TestClass中注入MyObject,那么TestClass和MyObject必须绑定jersey,TestClass必须由Jersey创建。两者都需要在 abstractBinder 中,并且都需要绑定为 .class,而不是完整的对象。 Jersey 不会注入您手动创建的对象
  • 那我该怎么办呢?我希望 MyObject 在我的整个应用程序中都可用。 Singleton 是唯一的机会吗?
猜你喜欢
  • 2023-04-05
  • 2013-10-28
  • 2011-10-16
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2010-12-19
相关资源
最近更新 更多