Ассоциации и веб-поток Grails - PullRequest
0 голосов
/ 23 апреля 2010

Я впервые использую веб-потоки в Grails, и я не могу решить эту проблему.

У меня есть 3 класса домена с ассоциациями, которые выглядят примерно так:

class A {
  ...
  static hasMany = [ b : B ]
  ...
}

class B {
  ...
  static belongsTo = [ a : A ]
  static hasMany = [ c : C ]
  ...
}

class C {
  ...
  static belongsTo = [ b : B ]
  ...
}

Теперь GSP связывается с контроллером через Javascript (из-за моего использования Dojo). Когда я пытаюсь дистанционно выполнить обычное действие, я могу сделать что-то вроде этого:

def action1 = {
   def anId = params.id
   def currA = A.get(anId)
   def sample = currA.b?.c // I can get all the way to 'c' without any problems
   ...
}

Однако у меня есть веб-поток, и содержимое этого действия находится в веб-потоке ... Это выглядит примерно так:

def someFlow = {
   ...
   someState {
      on("next") {
         def anId = params.id // this does NOT return a null value
         def currA = A.get(anId) // this does NOT return a null value
         def sample = currA.b // error already occurs here and I need to get 'c'!
      }.to("somePage")
      ...
   }
   ...
}

В этом случае он говорит мне, что b не существует ... поэтому я даже не могу добраться до 'c'. Любые предложения о том, что делать ??? Спасибо ... впадаю в отчаяние ...

1 Ответ

0 голосов
/ 25 апреля 2010

Хммм, не совсем уверен, в чем проблема, но я нахожу что-то любопытное.В вашем первом блоке вы используете следующее:

 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».Я не уверен, что ваше упрощение вашего реального кода скрывает похожий случай или нет, и я все еще не уверен, какую именно ошибку вы получаете, но это было чем-то, что меня поразило некоторое время назад, и это специфично для потока.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...