Как автоматически связать сервис в Grails (2.5.5) с несколькими заглавными буквами на фронте - PullRequest
0 голосов
/ 12 июня 2018

У меня есть класс домена с именем ABCDCode и я создал службу для этого ABCDCodeService.Теперь я хочу использовать этот сервис в контроллерах, поэтому я написал его следующим образом:

class TestController{
      ABCDCode abcdCode

      def index(int id){
           abcdCode.getData(id) //Here I am getting NullPOinterException
      }
}

Я подозреваю, что что-то не так с автопроводкой по имени.

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

У вас есть несколько вопросов.

1) Вы присваиваете переменную-член, но она никогда не инициализируется, поэтому вы получаете исключение NullPointerException.Вы должны сначала получить экземпляр из своей базы данных по идентификатору.

2) Помните, что контроллер должен быть поточно-ориентированным, назначив переменную-член в области видимости контроллера, он будет использоваться для многих вызовов вв то же время с непредсказуемым результатом.

3) Такие имена, как ABCDCode, противоречат соглашениям по присвоению имен Грааля.Используйте AbcdCode для домена и AbcdCodeService для службы, и все в порядке.

Это будет правильным подходом для класса домена AbcdCode и соответствующего сервиса AbcdCodeService:

// if not in the same module
import AbcdCode

class TestController {

    // correct injection of the service
    def abcdCodeService 

    // ids are Long, but you could omit the type
    def index(Long id) {
       // get instance from database by id, moved to method scope
       def abcdCode = AbcdCode.get(id) 
       // note the "?." to prevent NullpointerException in case
       // an abcdCode with id was not found.
       def data = abcdCode?.getData() 
  }

}

0 голосов
/ 12 июня 2018

Grails выглядит первые два символа для именования бобов.Если вторым символом контроллера / службы является заглавная, то Grails не преобразует первый символ в нижний регистр.

Например, имя компонента TestService - это testService, а имя компонента TEstService - TEstService.

Итак, ваш код становится

ABCDCode ABCDCode

def index(int id){
    ABCDCode.getData(id)
}

Но если вы хотите использовать abcdCode в качестве имени бина, то вы можете сделать это с помощью resources.groovy.Добавьте следующее в ваш resources.groovy файл -

beans = {
    springConfig.addAlias 'abcdCode', 'ABCDCode'
}
0 голосов
/ 12 июня 2018
class TestController{
  ABCDCode aBCDCode
}

должно работать

...