gpt4 book ai didi

java - 如何在我的自定义 Wicket 模型类中注入(inject) Spring bean?

转载 作者:IT老高 更新时间:2023-10-28 13:58:43 26 4
gpt4 key购买 nike

在自定义 Wicket 类中,与以下类似,我使用的是应由 Spring 注入(inject)的服务 bean,如 SpringBean 注释定义(来自 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) {
// ...
}
}
}

但是,这不起作用:reportService.generatePentahoReport() 失败并出现 NullPointerException,因为 由于某种原因,Spring 没有注入(inject) bean

奇怪的是,我在 Wicket Page 上使用了与匿名内部类完全相同的模型代码,并且没有任何问题。

我该如何解决这个问题?

最佳答案

wicket 依赖注入(inject)与实现 IComponentInstantiationListener 的类一起使用。每当实例化组件时,都会调用这些应用程序级监听器。这是用于组件依赖注入(inject)的钩子(Hook)。

模型类没有这样的机制。任何模型都可以直接实现 IModel,所以没有抽象基类可以调用监听器,不像 Component。

我将以下基类用于我的注入(inject)模型(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);
}
}

编辑:1.4 和 1.5 之间相关差异的摘要,取自 Wicket 1.5 migration guide :

Wicket 口 1.4

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

InjectorHolder.getInjector().inject(Object object)

Wicket 口 1.5:

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

Injector.get().inject(Object object)

关于java - 如何在我的自定义 Wicket 模型类中注入(inject) Spring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8155359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com