GWT RequestFactory 抛出 java.lang.UnsupportedOperationException:<Proxy interface class> 来自 ValueCodex.getTypeOrDie
GWT RequestFactory throws java.lang.UnsupportedOperationException: <Proxy interface class> from ValueCodex.getTypeOrDie
在我们的应用程序中,我们需要在 GWT 客户端和服务器之间共享域代码。因此,我们正在为 GWT 代理和服务器端实体使用通用接口。 @thomas-broyer 曾经在这里描述过这种方法:
异常堆栈跟踪:
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.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();
}
如果我们正确理解GWT代码,问题的原因来自ProxyAutoBean
:
for (Method method : beanType.getMethods()) {
if (BeanMethod.GET.matches(method)) {
toReturn.getters.add(method);
其中 beanType
是 AppointmentProxy.class
。 Java 反射 returns 这种接口的两种方法 (仅在超级开发模式下发生...):
public **abstract** PlaceProxy AppointmentProxy.getPlace()
public **default** IPlace AppointmentProxy.getPlace()
第一个是 GWT RequestFactory 代码预期并接受的,第二个不是...它会导致 java.lang.UnsupportedOperationException: IAppointment
异常。非常奇怪的事实是,我们只在已编译的 GWT 应用程序中遇到此问题。当我们使用 Super Dev Mode 从 IDE 启动应用程序时,未列出第二个 default ...
方法并且应用程序正常运行。
环境:
- GWT 2.6.1
- Java 版本 1.8.0_66
您对如何解决或解决问题有任何想法吗?
这可能是 https://github.com/gwtproject/gwt/issues/5925,已在 2.7 中修复。
在我们的应用程序中,我们需要在 GWT 客户端和服务器之间共享域代码。因此,我们正在为 GWT 代理和服务器端实体使用通用接口。 @thomas-broyer 曾经在这里描述过这种方法:
异常堆栈跟踪:
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.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();
}
如果我们正确理解GWT代码,问题的原因来自ProxyAutoBean
:
for (Method method : beanType.getMethods()) {
if (BeanMethod.GET.matches(method)) {
toReturn.getters.add(method);
其中 beanType
是 AppointmentProxy.class
。 Java 反射 returns 这种接口的两种方法 (仅在超级开发模式下发生...):
public **abstract** PlaceProxy AppointmentProxy.getPlace()
public **default** IPlace AppointmentProxy.getPlace()
第一个是 GWT RequestFactory 代码预期并接受的,第二个不是...它会导致 java.lang.UnsupportedOperationException: IAppointment
异常。非常奇怪的事实是,我们只在已编译的 GWT 应用程序中遇到此问题。当我们使用 Super Dev Mode 从 IDE 启动应用程序时,未列出第二个 default ...
方法并且应用程序正常运行。
环境:
- GWT 2.6.1
- Java 版本 1.8.0_66
您对如何解决或解决问题有任何想法吗?
这可能是 https://github.com/gwtproject/gwt/issues/5925,已在 2.7 中修复。