Grails - java.lang.IllegalStateException:无法初始化代理

时间:2015-08-06 14:59:19

标签: hibernate grails gorm grails-2.0

我有一个名为InventoryLineItem的域类,它具有InventoryAccess类型的属性:

class InventoryLineItem {

    InventoryAccess inventoryAccess
    ...
}

另一个名为LineItem的域类具有InventoryLineItem类型的属性:

class LineItem {

    InventoryLineItem inventoryLineItem
    ...
}

我遇到的问题是当我尝试从LineItem类访问InventoryAccess的任何属性时(例如inventoryLineItem.inventoryAccess?.allotment),我得到以下异常:

java.lang.IllegalStateException: Proxy for [com.acme.inventory.domain.InventoryAccess:8604205056156879654] could not be initialized

我将实例获取到LineItem实例,如下所示:

List<LineItem> lineItemsPendingTransfer = originalDeliveredItemIds.collect { Long id ->
    InventoryLineItem.get(id)?.lineItem
}

然后我遍历每个订单项,并为每个订单项调用LineItem中的方法执行此操作:

if (inventoryLineItem.inventoryAccess?.allotment?.scannableEndDate?.before(new Date())) {
    return LineItemTransferState.buildUnavailableState(UnavailableTransferReason.OUTDATED)
}

这就是问题发生的地方。一旦我尝试从inventoryAccess对象获取allotment属性,就会抛出异常。

我尝试将InventoryLineItem中的inventoryAccess属性设置为lazy: false,但这并没有帮助。

1 个答案:

答案 0 :(得分:0)

如果 InventoryAccess 应该保留在数据库中,那么它也需要是一个域类。

如果没有,那么您可以将其设为transient,但是您必须自己设置该值。例如,您可以添加 getter 来延迟初始化属性:

class InventoryLineItem {
    InventoryAccess inventoryAccess

    static transients = ['inventoryAccess']

    InventoryAccess getInventoryAccess() {
        if(inventoryAccess == null) {
            // do something to initialize inventoryAcces
        }

        return inventoryAccess
    }
}