gpt4 book ai didi

java - 保存图表时 GWT Autobean 卡住

转载 作者:行者123 更新时间:2023-12-02 13:44:51 25 4
gpt4 key购买 nike

我正在将 GWT 2.4 与编辑器和请求工厂框架一起使用。我有一个模型 Trip,它有一个地址“起点”和一个地址“目的地”。通过 UI 创建行程时,会自动创建两个地址并将其分配给该行程。用户填写详细信息并保存。由于某种原因,我在尝试持久保存到服务器时收到“autobean freeze 错误”。这段代码在 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);

结果:

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 freeze 错误;验证的内容是次要的。

编辑:经过进一步调查,我发现实体可以正常到达服务器并按预期持续存在。返回时抛出上述异常。 AddressProxy 是一个 ValueProxy,看起来 RF 不喜欢 Trip 带着这些关联回来。返回 null 可以“解决”问题,但这显然不会长期有效。

最佳答案

我知道这比您要求的要多得多,但这 3 个提示帮助了我(来自 here):

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

    如果实体被卡住(锁定更改),您不能:

    • 更改其属性

    • 在 requestContext 方法调用中使用它。

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

    实体什么时候可以被卡住?

    • 作为响应返回的每个实体都被卡住

    • requestContext 调用中使用的每个实体都将被卡住。

    在第一种情况下,解决方案很简单 - 您只需解锁给定的实体即可。为此,您必须使用 RequestContext 类的实例并调用 edit() 方法。

    StudentRequest req1 = requestFactory.studentRequest();  
    StudentProxy s2 = req1.edit(s1);

    在第二种情况下,您不应再使用给定的实体,它无法编辑,因为它已经分配了 requestContext。如果您想更改它,您必须再次从服务器检索该实体的实例,并按照 a) 点的说明进行操作。

  2. 尝试对已分配 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

    你肯定会收到一个异常:

    java.lang.IllegalArgumentException:尝试编辑先前由另一个 RequestContext 编辑的 EntityProxy

    如果您有一个 bean,但您无法跟踪在先前的方法调用中创建或编辑该 bean 的请求上下文,则可能会遇到此问题。在这种情况下,您必须将先前的 requestContext 保存在某处,或者将其与实体一起发送到感兴趣的点。最好的解决方案可能是创建一些特殊的层来保存当前使用的请求。

  3. 尝试重用已触发的请求上下文。

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

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

关于java - 保存图表时 GWT Autobean 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7479779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com