我有一个标准的Magnolia模块,我已经将其作为Spring MVC REST客户端实现。在这个模块中,我试图检索一个JCR节点并使用Node2BeanProcessor
将Node
对象转换为我的自定义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()
答案 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一样。