una tipos puede profunda perro penicilina partes inyectar inyecciones inyeccion intramuscularmente intramuscular gluteo donde dolor cuerpo como aplicar java spring dependency-injection wicket

java - tipos - ¿Cómo puedo inyectar un Spring Bean en mi clase personalizada de modelo Wicket?



partes del cuerpo donde se puede inyectar (2)

En una clase de Wicket personalizada, no muy diferente a la siguiente, estoy usando un bean de servicio que debe ser inyectado por Spring, como se define con la anotación de SpringBean (del proyecto wicket-spring).

public class ReportExportFileModel extends AbstractReadOnlyModel<File> { @SpringBean(name = "reportService") ReportService reportService; ReportDto reportDto; ReportExportFileModel(ReportDto reportDto) { this.reportDto = reportDto; } @Override public File getObject() { try { return reportService.generatePentahoReport(reportDto); } catch (ReportGenerationException e) { // ... } } }

Sin embargo, esto no funciona: reportService.generatePentahoReport() falla con NullPointerException, porque el bean no ha sido inyectado por Spring por algún motivo .

Curiosamente, he usado exactamente el mismo código de modelo como clase interna anónima en una página de wicket, y no había ningún problema allí.

¿Cómo puedo arreglar esto?


Aparentemente, los beans de Spring no se inyectan automáticamente a otras clases que no sean Pages . He corrido a esto también con mi clase personalizada WebRequestCycle.

Una solución fácil es activar la inyección manualmente usando InjectorHolder.getInjector().inject(this) .

Por lo tanto, escribir el constructor de esta manera hace que el modelo funcione según lo previsto:

ReportExportFileModel(ReportDto reportDto) { this.reportDto = reportDto; InjectorHolder.getInjector().inject(this); }

Editar : ah, justo después de publicar esto, encontré otra pregunta ASÍ con una explicación más precisa de lo que está sucediendo:

@SpringBean funciona solo en cualquier subclase de Componente.


La inyección de dependencia de wicket funciona con clases que implementan IComponentInstantiationListener. Estos oyentes de nivel de aplicación se invocan siempre que se crea una instancia de un Componente. Este es el gancho utilizado para la inyección de componentes por dependencia.

Las clases modelo no tienen dicho mecanismo en su lugar. Cualquier modelo puede implementar IModel directamente, por lo que no existe una clase base abstracta que pueda llamar a los oyentes, a diferencia de Component.

Utilizo la siguiente clase base para mis modelos inyectados (Wicket 1.5):

public abstract class InjectedDetachableModel<T> extends LoadableDetachableModel<T> { public InjectedDetachableModel() { Injector.get().inject(this); } public InjectedDetachableModel(T a_entity) { super(a_entity); Injector.get().inject(this); } }

Editar : Resumen de las diferencias relevantes entre 1.4 y 1.5, tomadas de la guía de migración de Wicket 1.5 :

Wicket 1.4

@Override protected void init() { // initialize Spring addComponentInstantiationListener(new SpringComponentInjector(this, applicationContext)); }

y

InjectorHolder.getInjector().inject(Object object)

Wicket 1.5:

@Override protected void init() { // initialize Spring getComponentInstantiationListeners().add(new SpringComponentInjector(this, applicationContext)) }

y

Injector.get().inject(Object object)