gwt java.lang.ExceptionInInitializerError

Posted

技术标签:

【中文标题】gwt java.lang.ExceptionInInitializerError【英文标题】: 【发布时间】:2012-06-16 00:44:59 【问题描述】:

我正在开发一个 GWT 应用程序,并不断收到如下所示的错误。

我遵循了有关 servlet 类命名约定的 GWT 教程,并遵循了 Service / Async / ServiceImpl 结构。

我还尝试添加 -XX:-UseSplitVerifier VM 参数来解决之前的问题。有什么想法吗?

SEVERE: javax.servlet.ServletContext log: Exception while dispatching incoming RPC    
call
java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at   

com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_   
(Runtime.java:127)
at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance  
(Runtime.java:135)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.instantiate 
(ServerSerializationStreamReader.java:914)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize 
(ServerSerializationStreamReader.java:556)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject 
(AbstractSerializationStreamReader.java:119)
at   
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader$ValueReader$8. 
readValue(ServerSerializationStreamReader.java:138)
at  
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserializeValue 
(ServerSerializationStreamReader.java:385)
at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:303)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall  
(RemoteServiceServlet.java:206)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost  
(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost
(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
(ServletHandler.java:1166)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter
(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter
(ServeBlobFilter.java:60)
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:122)
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:78)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at  
com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle
(JettyContainerService.java:369)
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)
Caused by: java.lang.UnsupportedOperationException: ERROR: GWT.create() is only usable    
in client code!  It cannot be called, for example, from server code.  If you are  
running a unit test, check that your test case extends GWTTestCase and that 
GWT.create() is not called from within an initializer or constructor.
at com.google.gwt.core.client.GWT.create(GWT.java:91)
at com.google.gwt.user.client.ui.UIObject.<clinit>(UIObject.java:187)
... 46 more

【问题讨论】:

注意到ERROR: GWT.create() is only usable in client code!?在你的 servlet 中查找 我的服务器代码中没有 GWT.create(),只有客户端代码中 您是否相应地配置了部署描述符 (web.xml)? 是的,将 Impl 类名作为 servlet 名称,将导入作为 servlet 类名。在 servlet 映射中,对 servlet 名称执行相同操作,并将 gwt.xml rename-to 属性和 RemoteServiceRelativePath("thisthing") 放在以 / 开头并由 / 分隔的 url 模式中 【参考方案1】:

几乎可以肯定,您正在调用一个仅作为 GWT 客户端的类。你有错误:

 Caused by: java.lang.UnsupportedOperationException: ERROR: GWT.create() is only usable    
in client code!  It cannot be called, for example, from server code.  If you are  
running a unit test, check that your test case extends GWTTestCase and that 
GWT.create() is not called from within an initializer or constructor.

您不需要自己专门调用“GWT.create()”来获取该异常。您可能会在服务器端调用 GWT 客户端专用类。此外,您可能在 RPC 的一个参数中甚至在服务器端调用的共享代码中包含“仅限客户端”对象。

【讨论】:

我作为参数的类,我试图从服务器端返回的类是在客户端定义的类。但我在服务器端类中导入了它。 这实际上可能是问题所在。即使该类在客户端代码上实现和实例化,在服务器端使用时仍会引发错误(如果它是使用 GWT.create() 创建的)。例如,尝试将该参数更改为字符串(只是为了查看错误是否消失),并查看它是否有效。如果错误消失,那么您将确定这是因为您正在使用该类。而且您需要一种机制来避免在服务器端使用它。 我尝试将参数和返回类型设置为字符串,但没有。这些是用于完成整个调用的对象: private GridServiceAsync gridSvc = GWT.create(GridService.class);和 AsyncCallback callback = new AsyncCallback() 的定义。如果我将 GridServiceImpl.class 连同参数和返回类型更改一起放在 GWT.create() 中,我会收到此错误:没有源代码可用于类型 com.test.grid.button.server.GridServiceImpl;你忘了继承一个必需的模块吗? GridServiceImpl 是服务器端的类 哦,快,我重新启动了 eclipse,我只用 GWT.create(GridService.class);它奏效了。类参数和返回类型确实是问题...... 我想我不知道如何更改实现以使其正常工作。非常感谢您的帮助努诺【参考方案2】:

FWIW,我遇到了同样的错误,它最终成为使用 GWT.create() 初始化的常量(静态最终)。该常量位于需要由 GIN 依赖注入解析器加载的类中。

IE:它试图在模块编译期间加载类(并调用 GWT.create())。

【讨论】:

以上是关于gwt java.lang.ExceptionInInitializerError的主要内容,如果未能解决你的问题,请参考以下文章

GWT:gwt-exporter:传递对象

GWT:XSRF:零星缺少 X-GWT-Permutation 标头

GWT RPC 未生成正确的 gwt.rpc 文件

解码根据 GWT 的序列化策略生成的 *.gwt.rpc 文件

GWT Spring 安全集成(纯 GWT,无 JSP)

在与 GWT Module Base 不同的上下文中调用 GWT 服务?