Comment puis-je obtenir un haricot de printemps injecté dans ma classe de modèle Wicket personnalisé?
Personnalisé dans un Guichet de la classe, pas à la différence de ce qui suit, je suis en utilisant un service de haricot qui doit être injecté par le Printemps, tel que défini à l'SpringBean annotation (à partir du guichet-projet pour le printemps).
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) {
//...
}
}
}
Toutefois, cela ne fonctionne pas: reportService.generatePentahoReport()
échoue avec NullPointerException, parce que le haricot n'a pas été injecté par le Printemps pour quelque raison.
Curieusement, j'ai utilisé le Modèle exact même code en tant qu'anonyme interne à la classe, un Guichet de la Page, et il n'y a pas de problème.
Comment puis-je résoudre ce problème?
source d'informationauteur Jonik
Vous devez vous connecter pour publier un commentaire.
Le conduit d'injection de dépendance travaille avec des classes de mise en œuvre de IComponentInstantiationListener. Ces au niveau de l'application des auditeurs sont appelés à chaque fois qu'un Composant est instancié. C'est le crochet utilisé pour l'injection de dépendances des composants.
Les classes du modèle n'ont pas un tel mécanisme en place. N'importe quel modèle peut directement mettre en œuvre IModel donc il n'y a pas de classe de base abstraite qui peut appeler les auditeurs, à la différence de la Composante.
J'utilise la suite de la classe de base pour mes modèles injection (Guichet 1.5):
Modifier:
Résumé des différences entre 1.4 et 1.5, prises de Guichet 1.5 guide de migration:
Wicket 1.4
et
Guichet 1.5:
et
Apparemment Printemps, les haricots ne sont pas automatiquement injecté à d'autres classes que les Pages. J'ai couru à ce aussi avec mon custom WebRequestCycle classe.
Une solution facile est de déclencher l'injection manuellement à l'aide de
InjectorHolder.getInjector().inject(this)
.Donc, écrit le constructeur comme cela rend le modèle fonctionne comme prévu:
Modifier: ah, juste après cette annonce, j'ai trouvé un autre DONC, la question avec une explication plus précise de ce qu'il se passe: