2016-04-19 5 views
0

В нашем приложении нам необходимо обмениваться доменным кодом между клиентом и сервером 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

Есть ли у вас какие-либо идеи о том, как исправить или обойти эту проблему?

+1

Вы пробовали новую версию GWT? 2.6 - почти два года, а 2.7 зафиксировано много ошибок в нем (с 2,8 готовится к вступлению в бета-версию в ближайшее время). –

+0

Да, GWT 2.6. устарел, и мы планировали обновить до 2.8 одновременно, пропустив 2.7. Но с 2.8-бетами мы сталкиваемся с некоторыми проблемами, о которых сообщалось в GitHub, но пока не исправлены. Принимая во внимание ответ Томаса Бройера, пропуская 2.7, была плохая идея. – ilya

ответ

0

Это может быть https://github.com/gwtproject/gwt/issues/5925, который был исправлен в 2.7.

+0

Большое спасибо за вашу помощь! Это была именно эта ошибка с GWT 2.6. Честно говоря, у нас уже есть исправление для этого, но была ошибка, которая нарушила переопределенное определение метода. – ilya