当前位置: 首页 > 面试题库 >

如何在自定义Wicket模型类中注入Spring bean?

岑驰
2023-03-14
问题内容

在自定义的Wicket类中,与下面的类似,我使用的是应由Spring注入的服务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尚未注入该bean

奇怪的是,我在Wicket页面上使用了与匿名内部类完全相同的Model代码,并且在那里没有问题。

我怎样才能解决这个问题?


问题答案:

检票口依赖项注入与实现IComponentInstantiationListener的类一起使用。每当实例化组件时,就会调用这些应用程序级侦听器。这是用于组件依赖注入的钩子。

模型类没有适当的机制。任何模型都可以直接实现IModel,因此与Component不同,没有抽象的基类可以调用侦听器。

我为注入的模型(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);
    }
}

编辑 :从Wicket 1.5迁移指南摘录的1.4和1.5之间的相关差异摘要:

小门1.4

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

InjectorHolder.getInjector().inject(Object object)

小门1.5:

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

Injector.get().inject(Object object)


 类似资料:
  • 问题是我写了简单的注释处理器,它根本不处理类型注释。simple annotations processor的源代码如下所示: 有什么想法如何使用或如何通过SimpleAnnotationsProcessor访问类型注释吗?使用可插入的注释处理API对我来说是不必要的,我认为它会比Java反射有更好的性能。无论如何,我也不知道如何通过Java反射访问类型注释。

  • 所以很明显,添加类型转换器还有其他方式,我通过显式配置转换服务来搞砸了?有没有一种方法可以注册自定义类型转换器而不踩到其他转换器?

  • 问题内容: 例如,我想创建一个类似于AngularJS实现“电子邮件”的自定义输入类型。 我要创建的是这样的输入类型: 关于如何做到这一点的任何想法?到目前为止,我仅能弄清楚如何实现自定义指令,其中“ path”是标记,属性或类的名称。 例如,我可以使它工作,但是它与其他表单字段 不一致 ,我真的希望它们看起来相同。 问题答案: 如果type属性设置为“ path”,则可以通过使用自定义逻辑创建输

  • 我想在任何目录的任何脚本中导入自定义编写的函数,就像在任何脚本中导入请求模块一样。我正在运行Ubuntu和Python 3.9 编辑:我按照本教程完成了我的要求-https://packaging.python.org/tutorials/packaging-projects/

  • 我正在使用Hibernate、JPA和Spring Boot。 我想持久化一个类型为“version”的自定义对象。“version”是一个处理复杂的对象,但它在表中对应于一个简单的VARCHAR字段。我能够从字符串构造版本和从版本对象构造字符串。 null 谢谢!!

  • 显然,可以创建一个TypeDef来根据方言切换实现。 我的问题是hibernate似乎没有识别它,值得注意的是,有一次我将“uuid-custom”作为类型中的静态字符串,并直接在中引用它,所以它并不是实际上不在类路径上。