我需要做些什么才能让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代码负责在快速入门环境中设置Jetty服务器,当运行Start时:
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 Dependencies,我使用的是jetty版本6.1.25。
答案 0 :(得分: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配置为bootstrap Weld后,它应该可以正常工作。但是,请不要考虑在servlet容器中使用Weld的限制:
http://docs.jboss.org/weld/reference/latest/en-US/html/environments.html#d0e5221
还要确保WEB-INF /目录中有一个空的(或已配置的)beans.xml。
答案 1 :(得分:1)
42Lines人员发布了一个Wicket-CDI integration library,其中包含一个工作示例项目。
其中一些人实际上是Wicket提交者;他们写好代码,他们知道他们在做什么。