Причина исключения GroovyCastException Grails NamedCriteriaProxy и решение

#exception #grails #groovy

#исключение #grails #groovy

Вопрос:

Это пример ошибки, которая была замечена в различных частях нашего кода и, похоже, является прерывистой.

Существует класс домена Grails следующим образом

 class Widget {
    Date futureTime

    static namedQueries = {
        current {
            isNull("futureTime")
        }
    }
}
  

Затем выполните следующий код

 List widgets = Widget.current.getAll()

for (Widget widget : widgets) {
    // iterate...
}
  

Однако в строке выше for (Widget widget : widgets) появляется следующее исключение:

 org.quartz.JobExecutionException:
org.codehaus.groovy.runtime.typehandling.GroovyCastException:
Cannot cast object 'org.grails.orm.hibernate.cfg.NamedCriteriaProxy@2e04ce84'
with class 'org.grails.orm.hibernate.cfg.NamedCriteriaProxy'
to class 'com.company.Widget'
  

Этот код не изменился и работал ранее. Ошибка, похоже, приходит и уходит. Часто (но не всегда) ошибка устраняется с помощью чистой сборки.

  • О чем эта ошибка?
  • Есть ли способ предотвратить это?

Комментарии:

1. Я считаю, что вам нужно Widget.current.list() вместо Widget.current.getAll()

2. @dmahapatro: я думал, что list() и GetAll() идентичны (без предоставленных аргументов). Знаете ли вы разницу?

3. Они идентичны при применении к классу домена. Я скептически getAll() отношусь к тому, доступно ли в именованном запросе. Вы пробовали использовать list() ?

4. @dmahapatro: я использовал list() , и это сработало, но проблема (как я уже упоминал) заключается в том, что это был существующий код, и getAll() он работал и раньше — проблема периодически. В коде есть и другие места, которые используют domainClass.namedQuery.get() и domainClass.namedQuery.findBy...() успешно. Но время от времени появляется ошибка, описанная выше.

5. Какая версия Grails используется?