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 は委任された defaultconfiguration を作成し、それを createNamedConfig クロージャの引数として使用します。引数の構成が、grails がロードされたときの構成と等しくないことを発見しました (これは Chainedconfiguration です)。チェーン構成は、ConvertersConfigurationInitializer の grails によってセットアップされ、これはプラグインの InitializingBean の初期化後にロードされます。そのため、JSON はプラグイン Bean の初期化時にデフォルトの grails 構成を認識しません。
[質問]
ConvertersConfigurationInitializer afterPropertiesSet の後に MyBean afterPropertiesSet が確実にロードされるようにすることは可能ですか? (MyBean で直接 ConvertersConfigurationInitializer を参照せずに)