Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用guice在控制器中注入我的服务类?_Java_Dependency Injection_Guice - Fatal编程技术网

Java 如何使用guice在控制器中注入我的服务类?

Java 如何使用guice在控制器中注入我的服务类?,java,dependency-injection,guice,Java,Dependency Injection,Guice,我想将DI特性添加到一个旧的代码库中,该代码库在控制器层中使用简单的服务实例 我尝试在控制器类中的serviceInterface字段之前使用@Inject。并使用@ImplementedBy(ServiceInterfaceImpl)注释我的ServiceInterface 我的代码如下所示: 控制器类 public class MyController { @Inject ServiceInterface serviceInterface; InitContext(

我想将DI特性添加到一个旧的代码库中,该代码库在控制器层中使用简单的服务实例

我尝试在控制器类中的
serviceInterface
字段之前使用
@Inject
。并使用
@ImplementedBy(ServiceInterfaceImpl)
注释我的ServiceInterface

我的代码如下所示: 控制器类

public class MyController {
    @Inject
    ServiceInterface serviceInterface;

    InitContext(..){
        // somecode
        Toto toto = serviceInterface.getToto(); //I get an NPE here
        // other code
    }
}
服务接口代码:

@ImplementedBy(ServiceInterfaceImpl.class)
public interface ServiceInterface {
     Toto getToto();
}
ServiceInterfaceImpl代码:

@Singleton
public class ServiceInterfaceImpl implements ConventionServices {
     Toto getToto(){
          //somecode
     }
}
我希望我的服务将被实例化,但我得到一个NPE,它表明我遗漏了什么,我尝试在我的服务构造函数之前添加
@Provides
,但没有任何更改。

您应该在构造函数中注入
ServiceInterface
,而不是作为字段注入 您的问题是您有空值,因为字段注入发生在构造函数注入之后。因此,将注入移动到构造函数,而不是字段注入:

public class MyController {
  private final ServiceInterface serviceInterface;
  @Inject MyController(ServiceInterface serviceInterface) {
    this.serviceInterface = serviceInterface;
    Toto toto = serviceInterface.getToto();
  }
  ...
}
您应该在构造函数中注入
ServiceInterface
,而不是作为字段注入 您的问题是您有空值,因为字段注入发生在构造函数注入之后。因此,将注入移动到构造函数,而不是字段注入:

public class MyController {
  private final ServiceInterface serviceInterface;
  @Inject MyController(ServiceInterface serviceInterface) {
    this.serviceInterface = serviceInterface;
    Toto toto = serviceInterface.getToto();
  }
  ...
}

什么负责实例化控制器类?如果您是通过调用
new
自己完成的,那么它将不在CDI上下文中,并且不会自动注入任何依赖项。我猜您可能没有手动实例化它,但是,皮带和支架…您如何构造控制器?使用您应该使用的注入器或通过调用构造函数直接调用注入器?我使用构造函数(InitContext)构造控制器字段(如果有帮助,这是一个jsp类型关闭应用程序,因此基本上我的控制器链接到一个jsp页面),所以您直接在代码的某个地方调用
new MyController()
?如果是这样,这就是为什么依赖项为
null
,如果手动构造,则需要手动注入。否则,您需要依赖一些支持CDI的框架来为您处理实例化。因此,我选择Guice作为将DI引入此应用程序的方法可能是错误的。我认为
@Inject
@implemeedby
足以实例化我的服务对象。实例化控制器类的责任是什么?如果您是通过调用
new
自己完成的,那么它将不在CDI上下文中,并且不会自动注入任何依赖项。我猜您可能没有手动实例化它,但是,皮带和支架…您如何构造控制器?使用您应该使用的注入器或通过调用构造函数直接调用注入器?我使用构造函数(InitContext)构造控制器字段(如果有帮助,这是一个jsp类型关闭应用程序,因此基本上我的控制器链接到一个jsp页面),所以您直接在代码的某个地方调用
new MyController()
?如果是这样,这就是为什么依赖项为
null
,如果手动构造,则需要手动注入。否则,您需要依赖一些支持CDI的框架来为您处理实例化。因此,我选择Guice作为将DI引入此应用程序的方法可能是错误的。我认为
@Inject
@implemeedby
足以对我的服务对象进行实例化。