2012-05-25 4 views
0

Для тестирования я попытался использовать функцию Window.alert() из пакета com.google.gwt.user.client.Window в моем проекте playn. Но когда я пытаюсь запустить программу, я получил сообщение об ошибке:using Window.alert() в проекте playn

«Причинено: java.lang.UnsupportedOperationException: ERROR: GWT.create() используется только в клиентском коде! Его нельзя вызывать для например, из кода сервера. Если вы используете единичный тест, проверьте, что ваш тестовый пример расширяет GWTTestCase и что GWT.create() не вызывается из инициализатора или конструктора. «

Я действительно не понимаю , В моем проекте playn используется только код на стороне клиента. Так в чем проблема?

+0

Вы можете предоставить фрагмент кода? Window.alert никогда не делал никаких проблем для меня, поэтому я заинтересован ... – Stefan

+0

Обновление: он отлично работает как веб-приложение, но не как приложение Java. –

ответ

0

GWT.create() в настоящее время поддерживается в чистом java в gwt trunk. Я сам использую его в проекте playnn {хотя и с небольшим сбоем: Force GWT compiler to stop pruning invalid CompilationUnits}.

Если вы загружаете и создаете багажник, вы сможете обойти проблемы GWT.create(), зарегистрировав ClassInstantiators для любого класса, вызывающего ваши ошибки. В этом случае класс Window имеет статический экземпляр WindowImpl, который бросает эту ошибку, когда jvm попадает в класс Window. Если вы зарегистрируете ClassInstantiator для WindowImpl, этого не произойдет. К сожалению, метод Window.alert переходит прямо в native js, поэтому он все равно может на вас напасть.

Если вы не знаете, как/хотите построить gwt с багажника, пингуйте мне электронное письмо, и я могу отправить вам банки. Если у вас все еще есть проблемы с .alert(), который является родным методом, дайте мне знать, и я создам настраиваемую сборку соединительных линий, которая отменит .alert() в singleton WindowImpl, так что вы можете заставить ее сделать что-то значимое, например всплывающее окно alert}; -

Если вы считаете себя авантюрным, загрузите gwt trunk, зайдите в Window, скопируйте статический метод предупреждения в метод уровня экземпляра на WindowImpl, сделайте исходный метод делегированным для WindowImpl, а затем в вашем java-коде , вызовите ServerGwtBridge.register (WindowImpl.class, новый ClassInstantiator() {...}) и верните любую реализацию, которую вы хотите для .alert() в java и android.

+0

Конечно, было бы проще просто зарегистрировать службу делегатов, которая отличается для каждой сборки, и вызовет gwt Window.alert(), в то время как Java или Android всплывают в виде виджета. Затем вам нужно будет запускать ваши вызовы для оповещения через делегата, но это избавит вас от необходимости взломать багажник. – Ajax