Хммм, не совсем уверен, в чем проблема, но я нахожу что-то любопытное.В вашем первом блоке вы используете следующее:
def sample = currA.b?.c
В соответствии с классами, которые вы создали, currA.b является коллекцией Bs, а не одной.Поэтому currA.b? .C будет коллекцией коллекций экземпляров класса C, по одной коллекции для каждого из B в currA.b
Я не уверен, что произойдет, если currA.b будет пустым.... учитывая оператор безопасности, который приравнивается к пустому с нулевым (через GroovyTruth), я бы сказал, что sample будет иметь нулевое значение.
Ничто из этого не помогает определить, почему указанная вами строка генерирует ошибку.Возможно, вы можете показать нам, в чем ошибка?Это NPE или какой-то другой?
Глядя на это больше, также похоже, что вам не хватает вызова функции "to":
on("event") { intraEvent code }.**to** "eventHandlerAction"
Возможно, ошибка, которую вы видитерезультат этого?
Кажется, нет.
Хорошо, единственное, о чем я могу думать, это то, что некоторое время назад (я думаю, v1.1) они сделали это, так что вам придетсяиспользовать этот."намного больше действий внутри потока.По сути, чтобы получить доступ к объектам и методам уровня контроллера, вам нужно поставить «this».перед доступом к ним.Допустим, вы хотите поместить полученный внутри IntEvent код в метод:
def goGetC() {
def anId = params.id
def currA = A.get(anId)
def sample = currA.b
}
Чтобы вызвать этот метод из кода события, вам необходимо использовать:
someState {
on("next") {
this.goGetC()
}.to ("wherever")
}
Если бы вы попытались вызвать goGetC () без «this.», Вместо этого вы бы завершили свой обработчик событий событием «goGetC».Я не уверен, что ваше упрощение вашего реального кода скрывает похожий случай или нет, и я все еще не уверен, какую именно ошибку вы получаете, но это было чем-то, что меня поразило некоторое время назад, и это специфично для потока.Надеюсь, это поможет.