【问题标题】:JSF2 managed bean annotation + scope + injection confusionJSF2托管bean注解+作用域+注入混淆
【发布时间】:2011-07-14 19:25:29
【问题描述】:

我想实现这个理想主义:

  1. 对于 JSF Bean 容器只有 1 个实现,例如只使用 Spring 或 Weld 但不能同时使用两者。目前我使用 Spring 作为后端,所以我更喜欢 Spring。
  2. 只有 1 个注解,在 @ManagedBean、@Named、@Model 之间进行选择
  3. 为了能够使用所有受支持的范围,例如@RequestScoped、@SessionScoped、@ViewScoped、@FlashScoped,也许还有@ConversationScoped
  4. 可以使用 spring-managed-services(后端服务)注入 JSF Bean,可能使用 @Inject 或 @Autowired

到目前为止,我一直没有找到实现这些目标的最佳组合,因为据我所知,如果我错了,请纠正我:

  1. @ManagedBean 不能被spring服务注入?
  2. @Named 可以使用 @Inject 注入 Spring 服务,但 @Named 使用的是 Weld。我可以只使用 spring 来管理 @Named 而不是 Weld 吗?
  3. @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


    【解决方案1】:

    Weld(实际上,JSR-299 Context and Dependency Injectionreference implementation,也称为 Java EE 6 CDI)或多或少是为了在 Java EE 6 环境中取代 Spring 而发明的。我建议使用 Java EE 6 CDI 而不是 Spring。当 Java EE 6 提供开箱即用的相同功能时,为什么还要使用第 3 方框架?

    如果 Spring 后端确实无法更改,那么我建议坚持使用它,不要与 Java EE 6 CDI 注释混用,以免造成混乱和维护头痛。

    【讨论】:

    • @BalusC: 如果我在服务层坚持使用 Spring,我应该在 JSF Bean 中使用什么注解(@ManagedBean vs @Named)?以我的经验,使用@ManagedBean 可以与@ViewScope 一起使用,但@Named 不能。使用@ManagedBean,我不能使用@Autowired 或@Inject 注入我的spring 服务,但是使用@Named,我可以使用@Inject 注入我的spring 服务。你对此有什么建议吗..?谢谢BalusC!
    • 我不做Spring,所以不能详细讲,但是我觉得这个链接很有用:cagataycivici.wordpress.com/2007/12/19/…
    • @BalusC:谢谢,这篇文章向我展示了一些我以前不知道的东西,非常好。但是,在春天之外,如果我要使用 @Named 而不是 @ManagedBean,我仍然会遇到无法使用 @ViewScope 的问题 .. 可能还有 flash 范围(我还没有尝试过)?你遇到过这样的情况吗?谢谢。
    • CDI 为此提供@ConversationScoped
    • @BalusC:所以基本上,我可以使用@ConversationScoped 来替换@ViewScope。为了获得与@ViewScope 相同的行为,我在想:在@PostConstruct,我执行conversation.begin(),以及任何可以更改为另一个视图的方法我执行conversation.end(),对吗?但是如果是这种情况,如果用户不点击结束当前对话的按钮并点击不同菜单中的另一个程序会发生什么?到那时之前的bean的对话不会结束。
    【解决方案2】:

    我可以使用 ManagedProperty 注释成功注入 Spring bean,如下所示。这是在 JSF 托管 Bean 上。 Spring bean 用于后端,我更喜欢 spring 用于后端。

    @ManagedProperty(name="userRepository", value="#{userRepository}")
    private UserRepository userRepository;
    //Setter and/or Getter
    

    价值在这里是最重要的。其实就是spring的豆名。我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2011-07-07
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多