【问题标题】:Accessing service from within src/groovy从 src/groovy 中访问服务
【发布时间】:2016-07-25 12:29:59
【问题描述】:

我已经构建了一些自定义编组器,并且正在尝试访问消息服务。我有以下代码。

resources.groovy

customObjectMarshallers(CustomObjectMarshallers){
    marshallers = [
        new PersonMarshaller(),
        new DepartmentMarshaller(),
        new ErrorsMarshaller()
    ]
}

CustomObjectMarshallers

class CustomObjectMarshallers {
    List marshallers = []

    def register(){
        marshallers.each {
            it.register()
        }
    }
}

ErrorsMarshaller

class ErrorsMarshaller {

    @Autowired
    def MessageSource messageSource

    void register(){

        JSON.registerObjectMarshaller(FieldError){ FieldError fieldError ->

            def pMap = [:]

            fieldError.properties.each { prop, val ->
                println 'prop ' + prop
                if( prop == 'rejected_value' || prop == 'arguments' || prop == 'class' || prop == 'codes' || prop == 'code' || prop == 'bindingFailure') {
                    return
                } else if(prop == 'defaultMessage') {
                    pMap[prop] = messageSource.getMessage(val, fieldError, Locale.US)
                } else {
                    pMap[prop] = MarshallerUtils.cleanPropertyValue(val)
                }               
            }

            return pMap
        }
    }
}

我收到以下异常

无法在空对象上调用方法 getMessage()。堆栈跟踪如下: java.lang.NullPointerException:无法在空对象上调用方法 getMessage() 在 org.hri.leaverequest.marshaller.ErrorsMarshaller$_register_closure1_closure2.doCall(ErrorsMarshaller.groovy:26) 在 org.hri.leaverequest.marshaller.ErrorsMarshaller$_register_closure1.doCall(ErrorsMarshaller.groovy:21) 在 grails.converters.JSON.value(JSON.java:202) 在 grails.converters.JSON.convertAnother(JSON.java:162) 在 grails.converters.JSON.value(JSON.java:202) 在 grails.converters.JSON.render(JSON.java:134) 在 org.hri.leaverequest.CalendarController.processRequest(CalendarController.groovy:154) 在 grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198) 在 grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) 在 grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.java:53) 在 grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:49) 在 grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:82) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 java.lang.Thread.run(Thread.java:744)

【问题讨论】:

  • 什么版本的 Grails?您是否配置了对这些包的扫描?
  • @JoshuaMoore 2.4 版,我不知道配置扫描这些包意味着什么。

标签: grails


【解决方案1】:

根据您的 Grails 版本(在本例中为 2.x),您可能需要在“Spring bean 扫描”中包含这些包。查看您的Config.groovy 并添加它们:

// packages to include in Spring bean scanning
grails.spring.bean.packages = ['com.example.my.package.here']

【讨论】:

  • 我假设我继续保持现有代码不变,只是将我的 src/groovy 包添加到 grails.spring.bean.packages?如果这是正确的,我已经这样做了,但没有成功。我仍然遇到同样的错误。
  • 从你的属性注入中移除def
  • 同样的错误 不能在空对象上调用方法 getMessage()。 Stacktrace 如下: java.lang.NullPointerException: 无法在 org.hri.leaverequest.marshaller.ErrorsMarshaller$_register_closure1_closure2.doCall(ErrorsMarshaller.groovy:26) 在 org.hri.leaverequest.marshaller.ErrorsMarshaller$ 的 null 对象上调用方法 getMessage() _register_closure1.doCall(ErrorsMarshaller.groovy:21)
  • 我不需要使用 ref('messageSource') 吗?
  • 删除 @Autowired 并将其更改为 def messageSource。我打赌这会解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2016-02-22
  • 2016-01-30
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多