【发布时间】:2011-07-14 19:25:29
【问题描述】:
我想实现这个理想主义:
- 对于 JSF Bean 容器只有 1 个实现,例如只使用 Spring 或 Weld 但不能同时使用两者。目前我使用 Spring 作为后端,所以我更喜欢 Spring。
- 只有 1 个注解,在 @ManagedBean、@Named、@Model 之间进行选择
- 为了能够使用所有受支持的范围,例如@RequestScoped、@SessionScoped、@ViewScoped、@FlashScoped,也许还有@ConversationScoped
- 可以使用 spring-managed-services(后端服务)注入 JSF Bean,可能使用 @Inject 或 @Autowired
到目前为止,我一直没有找到实现这些目标的最佳组合,因为据我所知,如果我错了,请纠正我:
- @ManagedBean 不能被spring服务注入?
- @Named 可以使用 @Inject 注入 Spring 服务,但 @Named 使用的是 Weld。我可以只使用 spring 来管理 @Named 而不是 Weld 吗?
- @Named 不支持 @ViewScoped 和 FlashScope 吗?
请分享您的想法和经验。
谢谢你:-)
2011 年 3 月 15 日更新
发现了一个有趣的page,它描述了如何用 Spring 替换 Jboss Weld 作为 JSR 299 CDI 实现。所以基本上,第 2 个问题得到了回答。数字 1 也得到了间接回答,因为我现在可以注入 spring 服务了。
但是,第 3 个问题仍然存在。如果我可以在@Named 中使用@ViewScoped 和Flash Scope,我会发现非常有帮助,例如this article。 Flash 范围的实现还有待观察,但到目前为止我能得到的最接近的是this page。
希望,用 spring 替换weld 作为 jsr 299 实现仍将使我能够使用@ConversationScoped。
现在要测试一下,祝我好运:-)
2011 年 3 月 18 日更新
成功地使用 Spring 3 代替焊接来执行 @Named、@Inject。重要的是在 faces-config.xml 中设置 el-resolver。
AFAIK,Spring 3 目前还不支持 CDI,所以再见 @ConversationScoped。
对于范围,我仍然必须使用 @Scope("request") 或 @Scope("session"),但如果我更喜欢 @RequestScoped (javax.enterprise.context.RequestScoped) 和 @SessionScoped,我可以使用this article提供的网桥。
this article 的 spring 的 Scope("view") 就像魔法一样工作 :-)
一个问题仍然存在,如何在 Scope("view")-beans 之间传递对象.. 祝我好运!
更新
啊..终于完成了.. 使用 JSF2 提供的 Flash 传递变量真的很神奇。 我不需要第三方实现。
所以基本上,我可以不用weld,但是使用spring,使用通用范围,包括视图范围,dan可以使用flash对象在bean之间传递。
缺少的一点是对话范围,这对我来说还不是主要问题。 希望未来的春天可以支持这种对话范围。
干杯:-)
【问题讨论】:
标签: spring jsf jsf-2 jboss-weld