使用 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 节点并使用 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);
当我运行它时,我遇到了变量node2Bean
的NullPointerException
。这意味着它没有正确注入。但是,我可以这样做:
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 RSSAggregator 没有拾取图像?