Gin @Inject on Variable para servicios RPC
-
28-10-2019 - |
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!
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.