Bra*_*rad 2 java gwt gwt2 requestfactory
我正在使用GWT 2.4编辑器并请求工厂框架.我有一个模型Trip,它有一个地址'origin'和一个Address'destination'.通过UI创建Trip时,会自动创建这两个地址并将其分配给Trip.用户填写详细信息并保存.出于某种原因,我在尝试持久化到服务器时遇到"autobean冻结错误".此代码在GWT 2.3中有效,我无法切换回来.我希望它不是GWT 2.4中的错误.以下是我正在做的一些示例代码:
RequestContext request = requestFactory.request();
TripProxy trip = request.create(TripProxy.class);
trip.setOrigin(request.create(AddressProxy.class));
trip.setDestination(request.create(AddressProxy.class));
driver.edit(trip, request);
this.trip = trip;
// … on save button clicked (different method)
RequestContext request = driver.flush();
request.save(trip).with(driver.getPaths()).fire(someReceiverImpl);
Run Code Online (Sandbox Code Playgroud)
结果是:
java.lang.IllegalStateException: The AutoBean has been frozen
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.checkFrozen(AbstractAutoBean.java:195)
at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.setProperty(AbstractAutoBean.java:270)
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
调用fire成功完成但在requestfactory内的某处,抛出上述错误.奇怪的是,实体保存在服务器上,但不强制执行验证.当我简化模型并删除地址关联时,验证和保存工作.我的主要问题是autobean冻结错误; 验证的东西是次要的.
编辑:经过进一步的调查,我发现实体正在使服务器正常,并按预期持续存在.它返回时抛出上述异常.AddressProxy是一个ValueProxy,它看起来像RF不喜欢Trip带回这些关联.返回null'修复'问题,但这显然不会长期工作.
111*_*01b 14
我知道这比你要求的要多得多,但是这三个技巧帮助了我(从这里开始):
试图编辑锁定的实体.
如果实体被冻结(锁定以进行更改),则不能:
改变它的属性
在requestContext方法调用中使用它.
如果您尝试这样做,您将收到异常: java.lang.IllegalStateException:AutoBean已被冻结.
当实体可能被冻结?
作为响应返回的每个实体都被冻结
在requestContext调用中使用的每个实体都将被冻结.
在第一种情况下,解决方案很简单 - 您只需要解锁给定的实体.为此,您必须使用RequestContext类的实例并调用edit()方法.
StudentRequest req1 = requestFactory.studentRequest();
StudentProxy s2 = req1.edit(s1);
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,您不应再使用给定的实体,它不能被编辑,因为它已经分配了requestContext.如果要更改它,则必须再次从服务器检索此实体的实例,并按照a)的说明进行操作.
尝试在已经分配了requestContext的实体上调用requestContext.edit().
如果您已从服务器检索实体或创建了新实体,并且您尝试使用另一个RequestContext来编辑它,例如以这种方式:
StudentRequest req = requestFactory.studentRequest();
s1 = req.create(StudentProxy.class);
// s1 is connected with "req" and one context is just enough for it
StudentRequest reqZZZ = requestFactory.studentRequest();
reqZZZ.edit(s1); // you cannot do it - here exception will be thrown
Run Code Online (Sandbox Code Playgroud)
你肯定会收到一个例外:
java.lang.IllegalArgumentException:尝试编辑以前由另一个RequestContext编辑的EntityProxy
在有bean的情况下,您可能会遇到此问题,但您无法跟踪在某些先前方法调用中创建或编辑Bean的请求上下文.在这种情况下,您必须将先前的requestContext保存在某处,或将其与实体一起发送到感兴趣的点.最好的解决方案可能是创建一个保存当前使用请求的特殊层.
尝试重用已被触发的请求上下文.
您可以使用请求上下文来创建和编辑许多不同的实体(也是不同类型的实体).您还可以累积应该触发的方法.但你不能做的是尝试两次使用它来发出请求.如果您已创建请求并在其上调用fire()方法,则无法再次执行此操作.如果您这样做,您将得到:java.lang.IllegalStateException:请求已在进行中.
解决方案是简单地创建一个新的requestContext.