2015-08-06 4 views
0

У меня есть класс домена под названием InventoryLineItem, который имеет свойство типа InventoryAccess:Grails - java.lang.IllegalStateException: Proxy не может быть инициализирована

class InventoryLineItem { 

    InventoryAccess inventoryAccess 
    ... 
} 

Там еще один класс домен, называемый LineItem, что имеет свойство типа InventoryLineItem:

class LineItem { 

    InventoryLineItem inventoryLineItem 
    ... 
} 

проблема я столкнулся, когда я пытаюсь получить доступ к любому из свойств InventoryAccess из класса LineItem (например 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) 
} 

В этом случае проблема возникает. Как только я попытаюсь получить свойство allotment из объекта inventoryAccess, исключение будет выбрано.

Я попытался установить свойство inventoryAccess в InventoryLineItem на lazy: false, но это не помогло.

+0

Вы должны дать Ваш вопрос больше контекста. Где в вашем приложении вы пытаетесь получить к нему доступ? Как вы получаете экземпляр inventoryLineItem? Это в контроллере? Сервис? Библиотека тегов? Включите код из этого раздела вашего приложения. –

+0

Я добавил контекст к исходному сообщению. Спасибо за помощь. – user1866924

+0

Является ли Inventory доступным для класса домена? –

ответ

0

Если InventoryAccess предполагается сохранить в базе данных, то он также должен быть классом домена.

Если нет, то вы можете сделать это transient, но тогда вам нужно будет установить значение самостоятельно. Например, вы можете добавить поглотитель к отложенной инициализации свойства:

class InventoryLineItem { 
    InventoryAccess inventoryAccess 

    static transients = ['inventoryAccess'] 

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

     return inventoryAccess 
    } 
} 
+0

InventoryAccess - это класс домена. Я закончил тем, что менял какой-то код, и все хорошо, но я до сих пор не совсем понимаю, почему все работает не так, как я его первоначально кодировал. – user1866924