Pregunta

Estoy un poco perdido con el uso de inyectos en variable.

Tengo este código funcionando:

private XXServiceAsync xxServiceAsync;

@Inject
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) {
    super(eventBus, mapper);

    this.xxServiceAsync = xxServiceAsync;
    initializeWidgets();
}

Con este código, puedo llamar a mi servicio RPC donde sea que necesite en la clase (con clic ...) Me gustaría borrar un poco el código inyectando directamente en la variable; haciéndolo :

@Inject
private XXServiceAsync xxServiceAsync;


protected IndexViewImpl(EventBus eventBus) {
    super(eventBus, mapper);
    initializeWidgets();
}

Esto siempre mantiene el servicio a Null. Estoy haciendo algo mal ? ¿Está la magia GIN con los servicios de RPC destinado a hacerse de otra manera?

¡Gracias!

¿Fue útil?

Solución

Todavía es nulo en ese punto, porque Gin (y Guice y otros marcos como este) no pueden asignar los campos hasta que el constructor haya terminado de funcionar.

Considere cómo se vería esto si cableara manualmente el código (recuerde que Gin/Guice engañará un poco para asignar campos privados, llamar a métodos no visibles):

MyObject obj = new MyObject();//initializeWidgets() runs, too early!
obj.xxServiceAsync = GWT.create(xxService.class);

Si necesita algo en el constructor, pasándolo al constructor. Si no lo necesita de inmediato (como hasta que se llame aswidget ()), entonces un campo o setter anotado con @Inject puede ser útil.

Otros consejos

Si tiene inyección de nivel de campo, puede usar un método vacío @Inject para hacer su inicialización posterior al inyección. El método inyectado no arg se ejecutará después de que se completen las inyecciones de campo en la clase.

@Inject void initialize(){
  ...
  initializeWidgets()
}

EDITAR: Dije anteriormente que también se ejecuta después de la inyección del método, pero las pruebas muestran que este no siempre es el caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top