1

使用 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 配置。

[问题]

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

4

1 回答 1

0

您可以使用loadAfter属性控制加载顺序。请检查一下 -插件文档 - 了解加载顺序

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

于 2017-02-03T16:23:08.457 回答