为什么 Dependency Injenct 只适用于 Resource class in jersey

Why Dependency Injenct only works in Resource class in jersey

我正在尝试为我的应用程序使用测试数据库。我正在使用 MyBatis。 我在 MyBatis 配置文件中配置了 2 个环境。我在我的 ResourceConfig subclass.

中设置了 属性
property("Env","development");

我能够在我的资源中获得这个价值,例如 development

@Context Application app;// this is instance variable

System.out.println(app.getProperties().get("Env"));// this statement in resource method

我有 3 层控制器(即资源 class)、操作层以及 DAO 和 DMO 映射器层。

但是在资源 class 中工作的上述 2 个语句在 DAO class 中不工作。我在 System.out.println

收到 NullPointerException

现在我必须在 Resource 中获取环境并将其传递到更多层。有一个更好的方法吗。

我只想选择测试库进行测试,开发库进行开发

很可能是因为您只是想自己实例化 DAO

@Path("boogers")
class Resource {
   Dao dao = new Dao()
}

那是行不通的。 Dao 需要通过 Jersey 的注入系统。该资源之所以有效,是因为它通过了注入系统。如果你想为你的 Dao 做同样的事情,那么你需要注入它并让它通过 DI 系统。这样系统会在将其注入资源之前将其注入所需的依赖项

@Path("boogers")
class Resource {
   @Inject
   Dao dao;
}

在这里,你不实例化它,你让DI系统创建它并注入它。要使其发挥作用,您需要使 Dao 可注射。

class AppConfig extends ResourceConfig {
    public AppConfig() {
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bindAsContract(Dao.class);
            }
        });
    }
}

在这里你将 Dao class 绑定到注入系统,这样每当它看到 @Inject Dao 时,它就能够 grab/create 它并注入它。