1

我需要做什么才能使 CDI 在我的 wicket 快速入门项目中工作?当我尝试启动 Jetty 服务器时,出现异常:

org.jboss.seam.solder.beanManager.BeanManagerUnavailableException: Failed to locate BeanManager using any of these providers: org.jboss.seam.solder.beanManager.DefaultJndiBeanManagerProvider(11), org.jboss.seam.solder.beanManager.ServletContainerJndiBeanManagerProvider(10)
at org.jboss.seam.solder.beanManager.BeanManagerLocator.getBeanManager(BeanManagerLocator.java:91)
at org.jboss.seam.wicket.SeamApplication.internalInit(SeamApplication.java:54)
at org.apache.wicket.protocol.http.WicketFilter.init(WicketFilter.java:723)
...

我正在创作一个检票口项目。我不知道 Seam、Weld 或 CDI 的第一件事。我想通过将它合并到一个小项目中来学习它。我正在关注此参考文档:

http://docs.jboss.org/seam/3/wicket/latest/reference/en-US/html_single/

现在,我在外星人文件的海洋中游泳,试图找到答案。帮助!

编辑:

wicket 快速入门中的 Jetty 服务器是通过编程方式创建的。根据下面给出的文档,我创建了:

webapp/WEB-INF/jetty-env.xml

<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
   "http://jetty.mortbay.org/configure.dtd">
<Configure id="webAppCtx" class="org.mortbay.jetty.webapp.WebAppContext">
   <New id="BeanManager" class="org.mortbay.jetty.plus.naming.Resource">
      <Arg><Ref id="webAppCtx"/></Arg> 
      <Arg>BeanManager</Arg>
      <Arg>
         <New class="javax.naming.Reference">
            <Arg>javax.enterprise.inject.spi.BeanManager</Arg> 
            <Arg>org.jboss.weld.resources.ManagerObjectFactory</Arg>
            <Arg/>
         </New>
      </Arg>
   </New>
</Configure>

web.xml中,我添加了以下代码段:

<resource-env-ref>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>
javax.enterprise.inject.spi.BeanManager
    </resource-env-ref-type>
</resource-env-ref>

<listener>
    <listener-class>org.jboss.seam.solder.resourceLoader.servlet.ResourceListener</listener-class>
</listener>

以下 Java 代码负责在运行 Start 时在快速启动环境中设置 Jetty 服务器:

    Server server = new Server();
    SocketConnector connector = new SocketConnector();

    // Set some timeout options to make debugging easier.
    connector.setMaxIdleTime(1000 * 60 * 60);
    connector.setSoLingerTime(-1);
    connector.setPort(8080);
    server.setConnectors(new Connector[] { connector });

    WebAppContext bb = new WebAppContext();
    bb.setServer(server);
    bb.setContextPath("/");
    bb.setWar("src/main/webapp");
    // FIXME: This doesn't seem to do anything? bb.addEventListener(new ResourceListener());
    server.addHandler(bb);

/* I don't know what this commented code does, but it doesn't fix the problem when uncommented. */
// START JMX SERVER
// MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
// MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);
// server.getContainer().addEventListener(mBeanContainer);
// mBeanContainer.start();

根据我的 Maven 依赖项,我正在使用码头版本 6.1.25。

4

2 回答 2

1

在 servlet 容器中,您需要自己引导 Weld CDI 以使其对 Seam 可用。文档在安装时说明了这一点:http:
//docs.jboss.org/seam/3/wicket/latest/reference/en-US/html_single/#wicket.installation

带有指向 Jetty 6 或 7 的相关 Weld 引导文档的链接:

http://docs.jboss.org/weld/reference/latest/en-US/html/environments.html#d0e5286

在将 Jetty 配置为引导 Weld 后,它应该可以正常工作。但是,请不要考虑在 servlet 容器中使用 Weld 的限制:http:
//docs.jboss.org/weld/reference/latest/en-US/html/environments.html#d0e5221

还要确保您的 WEB-INF/ 目录中有一个空的(或已配置的)beans.xml。

于 2011-07-25T10:00:14.647 回答
1

42Lines 人员发布了一个Wicket-CDI 集成库,其中包含一个工作示例项目。

其中几个人实际上是 Wicket 提交者;他们编写了很好的代码,并且他们知道自己在做什么。

于 2011-09-10T02:00:33.263 回答