我在编辑器和请求工厂框架中使用GWT2.4。我有一个模型Trip,它有一个地址'origin‘和一个地址'destination’。通过UI创建行程时,系统会自动创建这两个地址并将其分配给行程。用户填写详细信息并保存。由于某些原因,当我试图持久化到服务器时,我得到了“autobean冻结错误”。这段代码可以在GWT2.3中运行,我不能再切换回来。我希望这不是GWT2.4中的一个bug。下面是我正在做的一些示例代码:
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);结果如下:
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)对fire的调用成功完成,但在requestfactory中的某个地方抛出了上述错误。奇怪的是,实体保存在服务器上,但是没有强制执行验证。当我简化模型并删除地址关联时,验证和保存工作正常。我的主要问题是autobean冻结错误;验证是次要的。
编辑:在进一步的调查中,我发现实体可以正常地到达服务器,并且如预期的那样持久化。一旦返回,就会抛出上述异常。AddressProxy是一个ValueProxy,看起来RF不喜欢带着这些联想回来的Trip。返回null“修复”了这个问题,但这显然不会长期有效。
发布于 2011-09-22 23:15:57
这是由于未在服务器上使用相同的EntityManager造成的。
发布于 2012-06-05 02:32:17
我知道这比你要求的要多得多,但这3个技巧(来自here)帮了我的忙:
如果实体被冻结(锁定以进行更改),则无法执行以下操作:
- change its properties
- use it in requestContext method calls.如果您尝试这样做,您将收到异常:java.lang.IllegalStateException: AutoBean已被冻结。
实体何时可以冻结?
- every entity returned as a response is frozen
- every entity which has been used in requestContext call will be frozen.在第一种情况下,解决方案很简单--你只需要解锁给定的实体。为此,您必须使用RequestContext类的实例并调用edit()方法。
StudentRequest req1 = requestFactory.studentRequest();StudentProxy s2 = req1.edit(s1);
在第二种情况下,你不应该再使用给定的实体,它不能被编辑,因为它已经分配了一个requestContext。如果您想要更改它,您必须再次从服务器检索此实体的实例,并按照a点的说明进行操作。
如果您已从服务器检索到实体或创建了一个新实体,然后您尝试使用另一个RequestContext对其进行编辑,例如:
StudentRequest req = requestFactory.studentRequest();s1 = req.create(StudentProxy.class);// s1用"req“连接,一个上下文就够了StudentRequest reqZZZ = requestFactory.studentRequest();reqZZZ.edit(s1);//不能这样做-这里会抛出异常
你肯定会收到一个异常:
java.lang.IllegalArgumentException:正在尝试编辑以前由另一个RequestContext编辑的EntityProxy
在以下情况下,您可能会遇到此问题:您有一个bean,但您无法跟踪在之前的方法调用中创建或编辑该bean的请求上下文。在这种情况下,您必须将以前的requestContext保存在某个地方,或者将其与实体一起发送到兴趣点。最好的解决方案可能是创建一些特殊的层,其中包含当前使用的request.
您可以使用请求上下文来创建和编辑许多不同的实体(也是不同类型的实体)。您还可以累积应该触发的方法。但是您不能做的是尝试使用它两次来触发请求。如果您已经创建了一个请求并对其调用fire()方法,则不能再次执行此操作。如果这样做,您将得到:java.lang.IllegalStateException:A请求已在进行中异常。
解决方案是简单地创建一个新的requestContext.
https://stackoverflow.com/questions/7479779
复制相似问题