2012-10-16 30 views
0

在我的Java Google App Engine服務器應用程序中,我想啓用Channel Presence servlet,以使用Channel API跟蹤與我的頻道的連接/斷開連接(如here所述。我WEB-INF/appengine-web.xml文件等記載。在正常的Servlet中也遇到問題

大多數servlet在我的應用程序使用Sitebricks,而不是類擴展了HttpServlet,提供一種簡單的方法對我來說,在我的應用程序創建REST端點。但是,這似乎是在使用Sitebricks我類如此,不起作用,因爲當URL被擊中時我得到WARNING: No file found for: /_ah/channel/connected/

@At("/_ah/channel") 
@Service 
public class MyChannelPresenceServlet { 
    ... 
    @Post("/connected") 
    public void connectedMethod() { 
     ... 
    } 

    @Post("/disconnected") 
    public void disconnectedMethod() { 
     ... 
    } 
    ... 
} 

有什麼辦法可以讓我使用Sitebricks爲/-ah/channel/connected//_ah/channel/disconnected/提供一個REST URL端點,用於Channel Presence?

獎金問題

假設Sitebricks是不要去,相反,我要堅持這個extends HttpServlet和通過WEB-INF/web.xml配置正常servlet類的方式。這個其他解決方案仍然不適合我。比方說,我是把這個變成我的web.xml文件:

<servlet> 
    <servlet-name>channel_connect</servlet-name> 
    <servlet-class>com.example.PresenceServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>channel_connect</servlet-name> 
    <url-pattern>/_ah/channel/connected/</url-pattern> 
</servlet-mapping> 

在這個例子中,com.example.PresenceServlet是HttpServlet中的兒童和覆蓋的doPost(HttpServletRequest的,HttpServletResponse)這個方法從父。我仍然遇到問題:

WARNING: /_ah/channel/connected/ 
java.lang.InstantiationException: com.ea.pogosocial.rest.ChannelServiceServlet 
at java.lang.Class.newInstance0(Class.java:357) 
at java.lang.Class.newInstance(Class.java:325) 
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) 
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428) 
at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66) 
at com.google.sitebricks.SitebricksFilter.doFilter(SitebricksFilter.java:88) 
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163) 
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) 
at com.google.sitebricks.HiddenMethodFilter.doFilter(HiddenMethodFilter.java:75) 
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163) 
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) 
at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:59) 
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:49) 
at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163) 
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) 
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118) 
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.appstats.AppstatsFilter.doFilter(AppstatsFilter.java:141) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:110) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:380) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

所有幫助非常感謝。特別是來自Google員工。

PS:我使用GAE SDK 1.7.2我熱切期待着的1.7.3發佈)


更新

有一個更多的實驗我試過了。在我的servlet類的web.xml的<servlet>標記中,我添加了這個標記,以便強制我的servlet在服務器啓動時加載(順便說一句,在我的示例中使用mvn gae:run完成)。現在,我得到這個輸出

WARNING: /_ah/channel/connected/: javax.servlet.UnavailableException: java.lang.InstantiationException: com.ea.pogosocial.rest.ChannelServiceServlet 

回答

3

嗯,那太糟糕了。它看起來好像GAE內省servlet鏈嘗試發現/ _ah/channel/*的註冊處理程序免責聲明:我是Sitebricks和Guice Servlet的創建者,所以我覺得這很令人沮喪。有一次,我在GAE中實現了一個通道設置,我設法直接使用Channel API完成它: https://github.com/dhanji/crosstalk/blob/master/src/main/java/com/wideplay/crosstalk/web/RoomPage.java

+0

很高興看到主人自己回覆!我希望谷歌能更頻繁地做到這一點! – ecbrodie

0

如果現在還有人關心...

問題是,我可以使用既不Sitebricks也不吉斯注射爲處理POST請求信道狀態服務的URI一個Servlet 。一旦我刪除了這兩個,servlet就像一個魅力。