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

时间:2015-08-20 11:11:30

标签: java guice jcr magnolia

我有一个标准的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);
    }
}

当我运行此操作时,我遇到变量NullPointerException的{​​{1}}。这意味着它没有被正确注入。但是,我能够这样做:

node2Bean

node2Bean = Components.getComponent(Node2BeanProcessor.class); javadoc状态:"从当前设置的ComponentProvider返回一个组件。考虑使用IoC来代替注入组件。"这就是我想要弄清楚的。

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

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

感谢帮助。

P.S。现在我已经在Spring IoC中实现了一种使用它的hacky方法:

Components.getComponent()

2 个答案:

答案 0 :(得分:1)

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

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中)。

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

答案 1 :(得分:1)

如果Guice没有实例化JcrRepo,则Guice也无法注入Node2BeanProcessor字段。混合Spring和Guice IoC容器会让人感到困惑,所以我倾向于坚持使用Guice,就像Magnolia一样。