首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存图形时GWT Autobean冻结

保存图形时GWT Autobean冻结
EN

Stack Overflow用户
提问于 2011-09-20 11:27:37
回答 2查看 3.6K关注 0票数 2

我在编辑器和请求工厂框架中使用GWT2.4。我有一个模型Trip,它有一个地址'origin‘和一个地址'destination’。通过UI创建行程时,系统会自动创建这两个地址并将其分配给行程。用户填写详细信息并保存。由于某些原因,当我试图持久化到服务器时,我得到了“autobean冻结错误”。这段代码可以在GWT2.3中运行,我不能再切换回来。我希望这不是GWT2.4中的一个bug。下面是我正在做的一些示例代码:

代码语言:javascript
复制
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);

结果如下:

代码语言:javascript
复制
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“修复”了这个问题,但这显然不会长期有效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-22 23:15:57

这是由于未在服务器上使用相同的EntityManager造成的。

票数 0
EN

Stack Overflow用户

发布于 2012-06-05 02:32:17

我知道这比你要求的要多得多,但这3个技巧(来自here)帮了我的忙:

  1. 正在尝试编辑锁定的实体。

如果实体被冻结(锁定以进行更改),则无法执行以下操作:

代码语言:javascript
复制
- change its properties
- use it in requestContext method calls.

如果您尝试这样做,您将收到异常:java.lang.IllegalStateException: AutoBean已被冻结。

实体何时可以冻结?

代码语言:javascript
复制
- 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点的说明进行操作。

  1. 正在尝试对已分配了requestContext的实体调用requestContext.edit()。

如果您已从服务器检索到实体或创建了一个新实体,然后您尝试使用另一个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.

  • Trying,以重用已经触发的请求上下文。

您可以使用请求上下文来创建和编辑许多不同的实体(也是不同类型的实体)。您还可以累积应该触发的方法。但是您不能做的是尝试使用它两次来触发请求。如果您已经创建了一个请求并对其调用fire()方法,则不能再次执行此操作。如果这样做,您将得到:java.lang.IllegalStateException:A请求已在进行中异常。

解决方案是简单地创建一个新的requestContext.

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7479779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档