【问题标题】:Guice and JSF 2Guice 和 JSF 2
【发布时间】:2009-12-28 22:05:41
【问题描述】:

我正在尝试使用 Guice 来注入 JSF 托管 bean 的属性。这一切都在 Google App Engine 上运行(这可能很重要,也可能不重要)

我已按照此处的说明进行操作:

http://code.google.com/docreader/#p=google-guice&s=google-guice&t=GoogleAppEngine

第一步有一个问题。我不能子类化 Servlet 模块并在那里设置我的 servlet 映射,因为 Faces 由 javax.faces.webapp.FacesServlet 处理,该 javax.faces.webapp.FacesServlet 是 Servlet 的子类,而不是 HttpServlet。因此,我尝试将我的 servlet 配置保留在 web.xml 文件中,并在第二步中描述的上下文侦听器中创建注入器时简单地实例化一个新的 ServletModel() 以及我的业务模块。

完成所有这些之后,连同 web.xml 配置,我的托管 bean 没有注入任何属性。方法如下

@ManagedBean
@ViewScoped
public class ViewTables implements Serializable
{
    private DataService<Table> service;

    @Inject
    public void setService( DataService<Table> service )
    {
        this.service = service;
    }
    public List<Table> getTables()
    {
        return service.getAll();
    }
}

所以,我想知道是否有一个技巧可以让 Guice 注入到 JSF 托管 bean 中?我显然不能使用构造函数注入,因为 JSF 需要一个无参数构造函数来创建 bean。

【问题讨论】:

    标签: google-app-engine jsf dependency-injection guice


    【解决方案1】:

    【讨论】:

    • 在问这个问题之前我已经看过所有这些了,因为没有一个能开箱即用,我想我会问。我试过 Guicesf 和那个糖的东西,但它们都不起作用。我终于从 sn-ps.dzone.com 链接中获取了代码并对其进行了一点修改,它似乎可以正常工作。修改是将 Injector 创建移出 getValue,然后在创建时向它发送一个新的 ervletModule 和我自己的模块。否则它不起作用。然后我能够从 web.xml 中删除我的 ServletContextListener。可能比您想知道的要多,但感谢您的帮助!
    • 在这种情况下你应该提到“我试过这个,它没有工作以这种方式 / 有这个例外”; )
    • 是的,我应该有。对此感到抱歉。
    【解决方案2】:

    您还可以创建一个 HTTP servlet,然后将请求简单地委托给 FacesServlet(如包装器)。这应该会给您使用 Guice Servlet 相同的效果。

    【讨论】:

    • 呃,我怎么没想到呢?我可能比我自己的 ElResolver 更信任它,明天可能会试一试。谢谢!
    【解决方案3】:

    这种方法怎么样,对我们很有效:

    http://uudashr.blogspot.com/2008/12/guicing-jsf-with-guice.html

    【讨论】:

    • 真有趣,我最终做了非常相似的事情。 digitaljoel.wordpress.com/2010/05/01/guice-and-jsf-2
    • @digitaljoel 这仍然是将 Guice 集成到 JSF 中的最佳解决方案吗?您有机会在生产环境中对其进行测试吗?
    • @DanielNovak 我从来没有把它放到生产环境中,但我也从来没有在我的混乱中看到问题。我在谷歌应用引擎上玩这些东西。从那以后,我离开了 JSF 和 Guice(我喜欢 Guice),现在我正在为我自己的东西使用完整的 Spring 堆栈。
    • 感谢您的回复。我喜欢 Guice 如何与 MyBatis 和 Apache Shiro 集成并允许使用注释。但是这些功能使用 AOP(Guice 与某种 AOP 捆绑在一起)。当前项目需要JSF2。所以我没有找到比 Guice + JSF2 更好的组合...
    • @digitaljoel 不过有一个问题......您将 Guice 注入器放入了仅由 JSF 使用的自定义 InjectionProvider 中。如果您在同一个 Web 应用程序中有一个 Jersey (JAX-RS) REST 接口,该怎么办。您不能使用与 JSF 中相同的 Guice 注入器吗?这通常实现为 Servlet 过滤器... (jersey.java.net/nonav/apidocs/1.11/contribs/jersey-guice/com/…)。那么我的应用中需要两个 Guice 注射器?
    【解决方案4】:

    作为 jsf sugar 的开发者,我真的很想知道您在使用它时遇到的问题。我们已经在这里的生产中使用它,所以不应该有任何“阻碍”,也许有些东西没有很好的记录?给我发一封邮件:murbanek(at)gmx_net(将 _ 替换为 .)。

    【讨论】:

    • 将此作为对他的问题的评论,而不是作为答案。
    【解决方案5】:

    查看http://code.google.com/p/guice2jsf/ 和网站starchu.blogspot.com,它有提供Guice 和JSF 2.0 集成的优秀库

    【讨论】:

      【解决方案6】:

      由于这篇文章中的信息已经过时,但问题仍然相关,我想分享我对这个主题的发现。我写了一个小教程,包括一个关于如何设置一个完全由 guice 驱动的 web 堆栈的可运行示例项目。你可以在这里找到它:https://github.com/skuzzle/guice-jsf

      【讨论】:

        猜你喜欢
        • 2016-04-11
        • 2012-03-21
        • 2011-07-31
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        相关资源
        最近更新 更多