В нашем приложении нам необходимо обмениваться доменным кодом между клиентом и сервером GWT. Из-за этого мы используем общие интерфейсы для прокси-серверов GWT и серверных объектов. Этот подход был однажды описан @ томас-Бройер здесь: https://stackoverflow.com/a/15852887/187241GWT RequestFactory throws java.lang.UnsupportedOperationException: <Класс интерфейса прокси> из ValueCodex.getTypeOrDie
Исключения StackTrace:
ERROR com.google.web.bindery.requestfactory.server.SimpleRequestProcessor - Error while processing request
java.lang.UnsupportedOperationException: se.homework.hwbs.domain.shared.model.IAppointment
at com.google.web.bindery.autobean.shared.ValueCodex.getTypeOrDie(ValueCodex.java:388)
at com.google.web.bindery.autobean.shared.ValueCodex.decode(ValueCodex.java:312)
at com.google.web.bindery.requestfactory.shared.impl.EntityCodex.decode(EntityCodex.java:107)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor$3.visitReferenceProperty(SimpleRequestProcessor.java:633)
at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:370)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:162)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:97)
at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processOperationMessages(SimpleRequestProcessor.java:623)
Общий код:
public interface IAppointment {
IPlace getPlace();
}
public interface AppointmentProxy extends EntityProxy, IAppointment {
@Override
PlaceProxy getPlace();
}
public interface PlaceProxy extends EntityProxy, IPlace {
@Override
Long getId();
}
public interface IPlace extends IDatabaseEntity {
@Override
Long getId();
}
public interface IDatabaseEntity {
public Long getId();
}
Если мы understtod GWT кода правильно, причина проблемы исходит от ProxyAutoBean
:
for (Method method : beanType.getMethods()) {
if (BeanMethod.GET.matches(method)) {
toReturn.getters.add(method);
где beanType
является AppointmentProxy.class
. Java отражение возвращает два метода для такого интерфейса (бывает только в режиме Супер Dev ...):
public **abstract** PlaceProxy AppointmentProxy.getPlace()
public **default** IPlace AppointmentProxy.getPlace()
Первый, как ожидается, и принятый GWT RequestFactory кода, второй нет ... И это вызывает исключение java.lang.UnsupportedOperationException: IAppointment
. Очень странный факт заключается в том, что у нас есть эта проблема только в скомпилированном приложении GWT. Когда мы запускаем приложение из IDE с использованием режима Super Dev, второй метод default ...
не указан и приложение работает без ошибок.
Окружающая среда:
- GWT 2,6 .1
- Java версия 1.8.0_66
Есть ли у вас какие-либо идеи о том, как исправить или обойти эту проблему?
Вы пробовали новую версию GWT? 2.6 - почти два года, а 2.7 зафиксировано много ошибок в нем (с 2,8 готовится к вступлению в бета-версию в ближайшее время). –
Да, GWT 2.6. устарел, и мы планировали обновить до 2.8 одновременно, пропустив 2.7. Но с 2.8-бетами мы сталкиваемся с некоторыми проблемами, о которых сообщалось в GitHub, но пока не исправлены. Принимая во внимание ответ Томаса Бройера, пропуская 2.7, была плохая идея. – ilya