我想实现这个理想主义:
- 只有 1 个 JSF Bean 容器实现,例如仅使用 Spring 或 Weld,但不能同时使用两者。目前我使用 Spring 作为后端,所以我更喜欢 Spring。
- 如果只有 1 个注释,请在 @ManagedBean、@Named、@Model 之间进行选择
- 能够使用所有受支持的范围,例如 @RequestScoped、@SessionScoped、@ViewScoped、@FlashScoped,也许还有 @ConversationScoped
- JSF Bean 可以通过 spring-management-services(后端服务)注入(inject),也许使用 @Inject 或 @Autowired
到目前为止,我一直没有找到实现这些目标的最佳组合,因为据我所知,如果我错了,请纠正我:
- @ManagedBean 无法注入(inject) Spring 服务?
- @Named 可以使用 @Inject 注入(inject) Spring 服务,但 @Named 使用的是 Weld。我可以只使用 spring 来管理 @Named 而不是 Weld 吗?
- @Named 不支持 @ViewScoped 和 FlashScope?
请分享您的想法和经验。
谢谢你:-)
<小时/>2011 年 3 月 15 日更新
发现一个有趣的page描述了如何使用 Spring 替换 Jboss Weld 作为 JSR 299 CDI 实现。基本上,问题 2 已经得到解答。第 1 个问题也得到了间接回答,因为我现在可以注入(inject) spring 服务。
但是,第三个问题仍然存在。如果我可以在 @Named 中使用 @ViewScoped 和 Flash Scope,比如this article,我会发现非常有帮助。 。 Flash作用域的实现还有待观察,但到目前为止我能得到的最接近的实现是this page .
希望,用 spring 替换weld 作为 jsr 299 实现仍然能让我使用 @ConversationScoped。
现在要测试一下,祝我好运:-)
<小时/>2011 年 3 月 18 日更新
成功使用Spring 3代替weld来进行@Named、@Inject。重要的是在 faces-config.xml 中设置 el-resolver。
据我所知,Spring 3 目前还不支持 CDI,所以@ConversationScoped 再见。
对于范围界定,我仍然必须使用 @Scope("request") 或 @Scope("session"),但如果我更喜欢 @RequestScoped (javax.enterprise.context.RequestScoped) 和 @SessionScoped,我可以使用 this article 提供的桥接器.
Spring 的范围(“ View ”)来自 this article就像魔术一样:-)
仍然存在一个问题,如何在 Scope("view")-beans 之间传递对象.. 祝我好运!
<小时/>更新
啊啊..终于完成了.. 使用 JSF2 提供的 Flash 传递变量真的很神奇。 我不需要第三方实现。
所以基本上,我可以不用焊接,但是有了 spring,有了可用的公共(public)范围,包括 View 范围,dan 就可以使用 flash 对象在 bean 之间传递。
缺少的一件事是对话范围,这对我来说还不是一个主要问题。 希望 future 的 Spring 能够支持这个对话范围。
干杯:-)
最佳答案
我可以使用 ManagedProperty 注释成功注入(inject) Spring bean,如下所示。这是 JSF Managed Bean 上的。 Spring bean 用于后端,我更喜欢使用 spring 作为后端。
@ManagedProperty(name="userRepository", value="#{userRepository}")
private UserRepository userRepository;
//Setter and/or Getter
值(value)是这里最重要的事情。其实是 Spring 的 bean 名。我希望这会有所帮助。
关于spring - JSF2 托管 bean 注释 + 作用域 + 注入(inject)混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5295514/