gwt java.lang.ExceptionInInitializerError

Я работаю над приложением GWT и продолжаю получать сообщение об ошибке, показанное ниже.

Я следовал руководству 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

person user1459976    schedule 16.06.2012    source источник
comment
заметил ERROR: GWT.create() is only usable in client code!? посмотри в своих сервлетах   -  person Eliran Malka    schedule 16.06.2012
comment
у меня нет GWT.create() в моем серверном коде, только в клиентском коде   -  person user1459976    schedule 16.06.2012
comment
Вы соответствующим образом настроили дескриптор развертывания (web.xml)?   -  person Eliran Malka    schedule 16.06.2012
comment
да, поместите имя класса Impl для имени сервлета и поместите импорт для имени класса сервлета. и в сопоставлении сервлетов сделал то же самое для имени сервлета и поместил атрибут gwt.xml rename-to и RemoteServiceRelativePath(thisthing) в шаблон URL-адреса, начинающийся с / и разделенный /   -  person user1459976    schedule 17.06.2012


Ответы (2)


Почти наверняка вы вызываете класс, который является только клиентом 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 или даже в общем коде, вызываемом на стороне сервера.

person Nuno Gonçalves    schedule 16.06.2012
comment
класс, который у меня есть в качестве аргумента, и который я пытаюсь вернуть со стороны сервера, является классом, определенным на стороне клиента. но я импортировал его в класс на стороне сервера. - person user1459976; 17.06.2012
comment
Это действительно может быть проблемой. Даже если этот класс реализован и создан в клиентском коде, он все равно выдаст ошибку при использовании на стороне сервера (если он создан с помощью GWT.create()). Попробуйте изменить этот аргумент, например, на строку (просто чтобы посмотреть, исчезнет ли ошибка) и посмотрите, работает ли он. Если ошибка исчезнет, ​​вы будете уверены, что это потому, что вы используете этот класс. И вам понадобится механизм, чтобы избежать его использования на стороне сервера. - person Nuno Gonçalves; 17.06.2012
comment
я попытался сделать аргумент И возвращаемый тип строкой, но это не так. это объекты, используемые для всего вызова: private GridServiceAsync gridSvc = GWT.create(GridService.class); и обратный вызов AsyncCallback‹String› = new AsyncCallback‹String›() с определением. если я помещаю GridServiceImpl.class в GWT.create() вместе с аргументом и изменениями возвращаемого типа, я получаю эту ошибку: Исходный код недоступен для типа com.test.grid.button.server.GridServiceImpl; вы забыли наследовать необходимый модуль? GridServiceImpl — это класс на стороне сервера. - person user1459976; 18.06.2012
comment
ох, я перезапустил eclipse и попробовал только GWT.create(GridService.class); и это сработало. аргумент класса и тип возвращаемого значения действительно были проблемой... - person user1459976; 18.06.2012
comment
я думаю, я плохо вижу, как изменить реализацию, чтобы она работала. большое спасибо за помощь Нуно - person user1459976; 18.06.2012
comment
хорошо, так что раньше класс, который я пытался использовать в качестве аргумента и возвращаемого типа, расширенный Grid, но теперь у меня просто есть Grid как переменная экземпляра, и теперь я получаю эти ошибки: [ERROR] [gridbuttons] - com.google.gwt. user.client.ui.Grid не может быть назначен «com.google.gwt.user.client.rpc.IsSerializable» или «java.io.Serializable» и не имеет настраиваемого сериализатора полей (достигнутого через com.test.grid .button.client.TheGrid). Итак, я предполагаю, что Grid просто не сериализуем? Если это так, то это полный облом, потому что это почти все мое приложение. - person user1459976; 18.06.2012
comment
Почему вы хотите передавать Grid с/на сервер? Это не имеет смысла. Просто передайте информацию, которой вы хотите заполнить сетку. Это правильный подход. Просто создайте сериализуемый объект (реализует java.io.Serializable или gwt.IsSerializable) и заполните его данными, которые у вас есть в сетке (или наоборот, отправьте эту информацию с сервера и заполните ею сетку). Нет смысла отправлять виджеты на сервер. Если мой ответ помог вам, отметьте его как принятый. - person Nuno Gonçalves; 18.06.2012
comment
если я сделаю это таким образом, то будет сделано больше работы, чем необходимо. но на данный момент я просто хочу, чтобы эта штука работала через RPC. может быть, я что-то упустил в RPC, в чем именно его преимущества? - person user1459976; 18.06.2012
comment
Ну, на мой взгляд... общаться с сервером, чтобы получать данные оттуда, чтобы не перегружать клиентский код всеми данными, которые необходимы для запуска приложения. Вот почему нет смысла передавать виджеты туда и обратно. Вы передаете данные и заполняете виджеты объектами с сервера, и наоборот. Я предлагаю вам прочитать это: developers.google.com/web-toolkit/ документ/последний/учебник/ - person Nuno Gonçalves; 18.06.2012

FWIW, у меня была такая же ошибка, и в итоге она стала константой (статический финал), которая использовала GWT.create() для инициализации. Константа находилась в классе, который должен был быть загружен синтаксическим анализатором внедрения зависимостей GIN.

IE: он пытался загрузить класс (и вызвать GWT.create()) во время компиляции модуля.

person Peter L    schedule 27.09.2016