【问题标题】:grails initializing bean load ordergrails初始化bean加载顺序
【发布时间】:2016-11-18 09:30:21
【问题描述】:

使用 grails:3.1.12

[问题]

我创建了一个插件,它在初始化时创建一个名为 JSON 的配置,以便以后可以使用它。

豆子:

    MyBean implements InitializingBean{
        void afterPropertiesSet() throws Exception {
            JSON.createNamedConfig('mycfg',{
               it.registerObjectMarshaller(new MyObjectMarshaller())
            })
        }
    }

插件:

    Closure doWithSpring() { {->
       "myBean"(MyBean){}
    }}

但是当我想使用配置并转换一个简单的HashMap时,它会抱怨没有找到Marshaller。

   JSON.use 'mycfg',{([a:'3'] as JSON).toString()}

例外

  Caused by: org.grails.web.converters.exceptions.ConverterException: Unconvertable Object of class: java.util.LinkedHashMap
at grails.converters.JSON.value(JSON.java:182)
at grails.converters.JSON.render(JSON.java:119)

[调查]

JSON 在调用 createNamedConfig 时创建一个委托默认配置,并将其用作 createNamedConfig 闭包的参数。我发现参数配置不等于加载 grails 时的配置(这是一个链式配置)。链式配置是由 Grails 在 ConvertersConfigurationInitializer 中设置的,它是在我的插件的 InitializingBean 初始化之后加载的。因此,当我的插件 bean 初始化时,JSON 不知道默认的 grails 配置。

[问题]

是否可以确保 MyBean afterPropertiesSet 在 ConvertersConfigurationInitializer afterPropertiesSet 之后加载? (不直接在 MyBean 中引用 ConvertersConfigurationInitializer)

【问题讨论】:

    标签: json spring grails grails3


    【解决方案1】:

    您可以使用loadAfter 属性控制加载顺序。请检查一下 - plugin docs - understanding load order

    请参阅本节的Controlling Load Order 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2011-10-20
      相关资源
      最近更新 更多