CDI + Ear still needs a big rework so i'm not totally surprised Even wonder is removing load on startup would be enough to make it working.
A workaround is actually to use the whole tomee as the ear and put common libs in the shared classloader. That's not perfect but ear support of CDI is comming (i hope next spec version will handle that correctly since today it doesn't answer properly to it). Not sure we can hack on it before the releas, i fear it can break too much things and make us late for the release. I'd prefer to put it as a target for next release. *Romain Manni-Bucau* *Twitter: @rmannibucau* *Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* 2012/9/25 Luca Merolla <[email protected]> > Yes, I moved the war under webapps and there the injection works. also the > exception on deployment is gone. > > > On Tue, Sep 25, 2012 at 4:44 PM, Romain Manni-Bucau > <[email protected]>wrote: > > > hmm, > > > > can you test in a simple war please (== not an ear)? > > > > *Romain Manni-Bucau* > > *Twitter: @rmannibucau* > > *Blog: **http://rmannibucau.wordpress.com/*< > > http://rmannibucau.wordpress.com/> > > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* > > > > > > > > > > 2012/9/25 Luca Merolla <[email protected]> > > > > > Here is the sample: > > > > > > * > > > > > > > > > http://www.fileconvoy.com/dfl.php?id=g9c64757621dc468115011126f019deb361277a > > > * > > > * > > > * > > > Deployed under apps/Test.ear it should give the following errors: > > > > > > On Deployment I get this exception: which however I have already > noticed > > in > > > other web app, but it doesn't seems to effect the CDI injection later > > when > > > the app is running. In the other web app I get similar exception but > it's > > > only on deployment and then the @Inject works. > > > > > > http://pastebin.com/qvqn3WsD > > > > > > After deployment, If I try to establish the websocket connection and I > > get: > > > > > > Sep 25, 2012 4:36:42 PM > > > org.pokernuvola.galaxy.gametable.WebSocketGametableServlet > > > createWebSocketInbound > > > INFO: CREATE connection...FAIL > > > Sep 25, 2012 4:36:42 PM > > > org.pokernuvola.galaxy.gametable.GametableMessageInbound onOpen > > > INFO: Opening the connection |1| > > > Sep 25, 2012 4:36:42 PM > > > org.pokernuvola.galaxy.gametable.WebSocketGametableServlet > > > addGametableConnection > > > INFO: add connection...FAIL > > > Sep 25, 2012 4:36:52 PM > > > org.pokernuvola.galaxy.gametable.GametableMessageInbound onTextMessage > > > INFO: Got a message text! |Ping| > > > Sep 25, 2012 4:36:52 PM > > > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process > > > SEVERE: Error reading request, ignored > > > java.lang.NullPointerException > > > at > > > > > > > > > org.pokernuvola.galaxy.gametable.WebSocketGametableServlet.processTextCommand(WebSocketGametableServlet.java:74) > > > at > > > > > > > > > org.pokernuvola.galaxy.gametable.GametableMessageInbound.onTextMessage(GametableMessageInbound.java:35) > > > at > > > > > > > > > org.apache.catalina.websocket.MessageInbound.onTextData(MessageInbound.java:74) > > > at > > > > > > > > > org.apache.catalina.websocket.StreamInbound.doOnTextData(StreamInbound.java:186) > > > at > > > > > > org.apache.catalina.websocket.StreamInbound.onData(StreamInbound.java:134) > > > at > > > > > > > > > org.apache.coyote.http11.upgrade.UpgradeProcessor.upgradeDispatch(UpgradeProcessor.java:83) > > > at > > > > > > > > > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:583) > > > at > > > > > > > > > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) > > > at > > > > > > > > > java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) > > > at > > > > > > > > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) > > > at java.lang.Thread.run(Thread.java:662) > > > > > > > > > > > > On Tue, Sep 25, 2012 at 3:43 PM, Romain Manni-Bucau > > > <[email protected]>wrote: > > > > > > > can you share the sample please? > > > > > > > > *Romain Manni-Bucau* > > > > *Twitter: @rmannibucau* > > > > *Blog: **http://rmannibucau.wordpress.com/*< > > > > http://rmannibucau.wordpress.com/> > > > > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau* > > > > > > > > > > > > > > > > > > > > 2012/9/25 Luca Merolla <[email protected]> > > > > > > > > > Hi everyone, > > > > > > > > > > I have noticed this blog entry > > > > > > > > > > > > > > > > > > > > http://rmannibucau.wordpress.com/2012/05/15/tomee-or-how-to-use-websocket-with-cdi/ > > > > > and > > > > > I have compared to my solution which is very similar but on my case > > > since > > > > > CDI was not working I had to put some code in the init() method of > my > > > > > servlet to retrieve the Beans, like this: > > > > > > > > > > jsonProvider = (JsonProviderBean) getServletContext().getAttribute( > > > > > GalaxyConstants.JSON_PROVIDER_BEAN); > > > > > processor = WebSocketConnectionProcessor.getInstance(jsonProvider); > > > > > > > > > > the jsonProvider was created in my ServletContextListener class and > > the > > > > > servlet was simply retrieving it. For the > > WebSocketConnectionProcessor > > > I > > > > > opted to make the class singleton and in this way it was working. > > > > > > > > > > Despite this solution, I have tried to follow the example from the > > blog > > > > of > > > > > Romain because I would like to inject the processor. > > > > > > > > > > @WebServlet(urlPatterns = "/gametable", asyncSupported = true, > > > > > loadOnStartup = 1) > > > > > public class WebSocketGametableServlet extends WebSocketServlet > > > > implements > > > > > IWebSocketServlet { > > > > > > > > > > private static final long serialVersionUID = -6573757123424131706L; > > > > > > > > > > protected final Logger LOGGER = LoggerFactory.getLogger(getClass() > > > > > .getName()); > > > > > > > > > > @Inject > > > > > private WebSocketGametableProcessor processor; > > > > > private JsonProviderBean jsonProvider; > > > > > > > > > > public void init() throws ServletException { > > > > > LOGGER.info("Initialize Lobby WebSocket servlet"); > > > > > super.init(); > > > > > > > > > > initializeWebSocketProcessor(); > > > > > LOGGER.info("Web Socket connection processor initialized"); > > > > > } > > > > > > > > > > /** > > > > > * Get the JSON provider bean from the servlet context and retrieve > > the > > > > > * {@link WebSocketGametableProcessor} instance > > > > > */ > > > > > private void initializeWebSocketProcessor() { > > > > > LOGGER.info("Getting the json provider bean"); > > > > > jsonProvider = (JsonProviderBean) getServletContext().getAttribute( > > > > > GalaxyConstants.JSON_PROVIDER_BEAN); > > > > > > > > > > // LOGGER.info("Getting the websocker processor instance"); > > > > > // processor = > WebSocketGametableProcessor.getInstance(jsonProvider); > > > > > } > > > > > > > > > > /* > > > > > * (non-Javadoc) > > > > > * > > > > > * @see > > > > > * > > > org.apache.catalina.websocket.WebSocketServlet#createWebSocketInbound > > > > > * (java.lang.String, javax.servlet.http.HttpServletRequest) > > > > > */ > > > > > @Override > > > > > protected StreamInbound createWebSocketInbound(String arg0, > > > > > HttpServletRequest request) { > > > > > return new GametableMessageInbound(this, > > > > > (Long) request.getAttribute(WebSocketConstants.SESSION_ID)); > > > > > } > > > > > > > > > > @Override > > > > > public void addConnection(LobbyKey lobbyKey, > > > > > AbstractMessageInbound lobbyConnection) { > > > > > if (processor == null) > > > > > LOGGER.info("add connection...FAIL"); > > > > > else > > > > > LOGGER.info("add connection..."); > > > > > } > > > > > > > > > > @Override > > > > > public void removeConnection(LobbyKey lobbyKey, > > > > > AbstractMessageInbound lobbyConnection) { > > > > > if (processor == null) > > > > > LOGGER.info("remove connection...FAIL"); > > > > > else > > > > > LOGGER.info("remove connection..."); > > > > > } > > > > > > > > > > @Override > > > > > public void processTextCommand(String jsonCommand) { > > > > > processor.processWebsocketCommand(jsonCommand); > > > > > } > > > > > } > > > > > > > > > > The WebSocketGametableProcessor has no other dependencies > > > > > > > > > > public class WebSocketGametableProcessor { > > > > > > > > > > private static final Logger LOGGER = LoggerFactory > > > > > .getLogger(WebSocketGametableProcessor.class); > > > > > > > > > > private WebSocketGametableProcessor() { > > > > > > > > > > } > > > > > > > > > > public void processWebsocketCommand(String jsonCommand) { > > > > > LOGGER.info("Received json command |{}|", jsonCommand); > > > > > } > > > > > } > > > > > > > > > > And as result I have that the WebSocketGametableProcessor is null > in > > > the > > > > > servlet. I was using the snapshot from last week, I have just run > the > > > > > latest 1.5.1-SNAPSHOT and the issue persist. > > > > > > > > > > Luca > > > > > > > > > > > > > > >
