Измените название введенной службы в Grails - PullRequest
4 голосов
/ 09 февраля 2012

Не могу найти информацию об этом, если у вас есть, пожалуйста, укажите мне на нужную тему / сообщение / ссылку!

У меня есть служба, скажем, она называется SomeServiceWithAReallyLongNameICannotChange.Конечно, обычный способ использования сервисов - это разрешить Grails вводить их, используя либо типизированную, либо типизированную запись:

class SomeClass{
    //...
    def someServiceWithAReallyLongNameICannotChange
    //...
}

- или -

class SomeClass{
    //...
    SomeServiceWithAReallyLongNameICannotChange someServiceWithAReallyLongNameICannotChange
    //...
}

Что я хотел бысделать это переименовать службу на что-то более короткое, но только там, где я его использую, так как я не могу изменить название фактической службы.Я попытался использовать нотацию «как», как вы делаете это при импорте, и я попытался изменить имя в напечатанном объявлении, но ни одна из этих вещей не работает.Возможно ли это?

Я пробовал что-то вроде этого:

class SomeClass{
    //...
    def someServiceWithAReallyLongNameICannotChange as SS
    //and I tried
    def SomeServiceWithAReallyLongNameICannotChange SS
    //no joy
    //...
}

Спасибо за вашу помощь!

Ответы [ 4 ]

6 голосов
/ 10 февраля 2012

Решение состоит в том, чтобы использовать autowire по типу.По умолчанию Grails использует autowire по имени, и поэтому вы должны объявить службу с тем же именем, что и bean-компонент.

Вот пример

class FooController {

  boolean byName = false  //set autowire by type
  SomeReallyLongService service

}
  1. Вы должны определить логическую переменнуюbyName и установите для него значение false
  2. Вы не можете использовать def, но должны использовать фактический тип сервиса при объявлении сервиса
  3. . Он включит автопровод по типу для всего контроллера, поэтому все другие зависимоститакже будет автоматически подключен по типу

Это объяснено здесь

Обновление: даже возможно использовать аннотацию Autowired вместе с классификатором.

Пример:

class MyController {

  @Autowired
  @Qualifier("myServiceWithDifferntName")
  def someService

}
3 голосов
/ 10 февраля 2012

Вы можете создать новый бин с помощью resources.groovy

beans = {
    ss(SomeServiceWithAReallyLongNameICannotChange)
}

Затем вы можете добавить его в обычном режиме:

class SomeClass {
    //...
    def ss
    //...
}
1 голос
/ 10 февраля 2012

Другой вариант, если вы не хотите использовать autowire по типу через весь контроллер и не хотите по какой-то причине добавлять пользовательский компонент, это добавить простой метод в ваши контроллеры, где вам нужен сервис, вот так:

def someServiceWithAReallyLongNameICannotChange
def getSS() { someServiceWithAReallyLongNameICannotChange }

Тогда вы можете ссылаться на сервис, используя ss.someMethod() в любом месте этого контроллера.

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

(Лично я считаю, что метод doelleri является лучшим, поскольку он позволяет вам быть последовательным в именовании без изменения отдельных классов.)

0 голосов
/ 21 июля 2017

Я попробовал это, и это не работает для меня на Grails 3, сделал это, выполнив

import org.springframework.beans.factory.annotation.Autowired
...
@Autowired
PaymentStrategyService paymentStrategySvc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...