NullPointerException с внедрением зависимости - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь использовать внедрение зависимостей для экспорта, чтобы превзойти функциональность, предоставляемую «Экспортным плагином». Кажется, что когда бы я ни пытался использовать сервис в своем проекте, я получаю сообщение об ошибке, например:

Stacktrace follows:
java.lang.NullPointerException: Cannot invoke method export() on null object
    at pm.ProjectsController$_closure2.doCall(ProjectsController.groovy:39)
    at pm.ProjectsController$_closure2.doCall(ProjectsController.groovy)
    at java.lang.Thread.run(Thread.java:662)

Код IЯ использую следующее, это просто означает, что переменная службы имеет значение null

def exportService// i have  tried with and without the initialization
        if(params?.format && params.format != "html"){
            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
            response.setHeader("Content-disposition", "attachment; filename=books.${params.extension}")

            exportService.export(params.format, response.outputStream,projectsList, [:], [:])
        }

Кажется, что ни один плагин, который использует службы, не работает в моем проекте, например, AsynchronousMailService в моем проекте не работал, как предполагалось, итаким образом, я использовал его следующим образом

AsynchronousMailService asynchronousMailService = new AsynchronousMailService()
            asynchronousMailService.sendAsynchronousMail  {    
                to projectsInstance.projectLead.emailAddress
                subject "New project is assigned to you"
                html msg
            }

Если я не пропустил кое-что очень простое, я не верю, что мне следует создавать экземпляр этого класса, если плагин предлагает то же самое, что и сервис.

Спасибо

1 Ответ

3 голосов
/ 20 октября 2011

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

Вы не используете внедрение зависимостей, вы объявляете локальную переменную и ожидаете магии.

Внедрение зависимостей в Grails использует открытые поля.Поскольку Groovy создает открытое поле в получателе и установщике под капотом, Spring видит, что установщик и Grails настроены на внедрение по имени, при условии, что поле / установщик совпадает с именем bean-компонента Spring.

Поэтому ваш контроллер должен выглядеть примерно так:

class MyController {

   def exportService

   def myAction = {
      if (params?.format && params.format != "html") {
         response.contentType = grailsApplication.config.grails.mime.types[params.format]
         response.setHeader("Content-disposition",
                            "attachment; filename=books.${params.extension}")

         exportService.export(params.format,
                 response.outputStream,projectsList, [:], [:])
      }
   }
}

Обратите внимание, что я также прекратил использование ConfigurationHolder, поскольку он устарел.Лучший способ получить доступ к конфигурации - это bean-компонент grailsApplication.Он уже внедрен в контроллеры (и теги), а в сервисе или другом компоненте вам просто нужно объявление поля def grailsApplication.

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