使用 IoC 在我的 Magnolia 模块中注入 Node2BeanProcessor 而不是使用组件

Posted

技术标签:

【中文标题】使用 IoC 在我的 Magnolia 模块中注入 Node2BeanProcessor 而不是使用组件【英文标题】:Using IoC to inject a Node2BeanProcessor in my Magnolia module instead of using Components 【发布时间】:2015-08-20 11:11:30 【问题描述】:

我有一个标准 Magnolia 模块,我已将其实现为 Spring MVC REST 客户端。在这个模块中,我试图检索一个 JCR 节点并使用 Node2BeanProcessorNode 对象转换为我的自定义 bean。代码如下:

@Repository
public class JcrRepo() 
    @Inject
    public Node2BeanProcessor node2Bean;

    public MagicWord getMagicWord(String key) 
        Session session = LifeTimeJCRSessionUtil.getSession("magic");

        Node theNode = session.getNode("/magicWords/" + key);

        return node2Bean.toBean(theNode, MagicWord.class);
    

当我运行它时,我遇到了变量node2BeanNullPointerException。这意味着它没有正确注入。但是,我可以这样做:

node2Bean = Components.getComponent(Node2BeanProcessor.class);

Components.getComponent() javadoc 声明:“从当前设置的 ComponentProvider 返回一个组件。考虑改用 IoC 来注入该组件。”这是我想要弄清楚的。

请注意,我没有进行任何 Guice 配置,因为我正在寻找一种方法来利用 Magnolia 已经初始化的 Guice 上下文来获取我的对象。

有没有比这更好的注入方法,或者我做错了什么或跳过了一步?

感谢您的帮助。

附:现在我已经实现了一种在 Spring IoC 中使用它的 hacky 方式:

@Bean
public Node2BeanProcessor node2Bean() 
    return Components.getComponent(Node2BeanProcessor.class);

【问题讨论】:

你能edit 包含你的Guice 模块吗? @durron597 实际上我没有在 Guice 中配置任何东西。我正在寻找一种方法来使用主 Magnolia 项目中已经存在的 Guice 上下文。将尝试编辑。 【参考方案1】:

(使用 Magnolia 4.5)我在实现 info.magnolia.module.ModuleLifecycle 的类中将 @Inject 用于 Node2BeanProcessor

public class MyModule implements ModuleLifecycle 
    @Inject
    private Node2BeanProcessor node2BeanProcessor;

    @Override
    public void start(ModuleLifecycleContext moduleLifecycleContext) 
        ...
        getNode2BeanProcessor().toBean(someNode);
        ...
    

也许您的NullPointerException 来自theNode?您是否验证过theNode 不是null

另一个猜测是它可能是一个生命周期问题。据我所知,Components.getComponent()@Inject 不适用的情况下工作(在 Magnolia 中)。

最后:你的实例变量绝对应该是私有的。

【讨论】:

【参考方案2】:

如果 JcrRepo 没有被 Guice 实例化,那么 Guice 也将无法注入 Node2BeanProcessor 字段。混合使用 Spring 和 Guice IoC 容器可能会让人感到困惑,所以我倾向于坚持使用 Guice,因为 Magnolia 就是这样。

【讨论】:

以上是关于使用 IoC 在我的 Magnolia 模块中注入 Node2BeanProcessor 而不是使用组件的主要内容,如果未能解决你的问题,请参考以下文章

在 Magnolia 5.3 中创建独立模块

Magnolia 模块不包括代码更改

如何在使用Unity IoC容器时注入属性?

Magnolia RSSAggregator 没有拾取图像?

Magnolia CMS 无法识别我的轻型模块 .jar 文件

如何在 Magnolia CMS 的本地系统中存储资产和网站内容?