grails初始化bean加载顺序

时间:2016-11-18 09:30:22

标签: json spring grails grails3

使用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)

[调查]

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

[问题]

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

1 个答案:

答案 0 :(得分:0)

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

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