Grails アプリケーションのコンテキストでは、JSON をコマンド オブジェクトに解析します。JSON マップから POGO への自動変換は、次のようなエラーで失敗します。
org.codehaus.groovy.runtime.typehandling.GroovyCastException
:クラス ' ' のオブジェクト ' ' をクラス ' ' に
キャストできません: : 列挙定数がありません{<snip>}
groovy.json.internal.LazyMap
SomeCmd
java.lang.IllegalArgumentException
Foo.my-bar
このプレーンな Groovy MWE に絞り込みました。
import groovy.json.JsonSlurper
enum Foo {
Bar("my-bar"),
Ista("my-ista")
final String s
private Foo(String s) {
this.s = s
}
}
class SomeCmd {
Foo foo
}
def some = new SomeCmd(new JsonSlurper().parseText('{ "foo" : "my-bar" }'))
println(some.foo)
このエラー
java.lang.IllegalArgumentException
: 列挙定数なしFoo.my-bar
これは予想どおりです。これまでのところ、非常に良好です。
さて、ドキュメンテーションに従って、からカスタム強制を追加すると問題が解決する可能性があるString
と思いました(こちらからも):Foo
enum Foo {
<snip>
static Foo fromJsonString(String s) {
return values().find { it.s == s }
}
}
def oldAsType = String.metaClass.getMetaMethod("asType", [Class] as Class[])
String.metaClass.asType = { Class type ->
type == Foo ?
Foo.byJsonString(delegate as String) :
oldAsType.invoke(delegate, [type] as Class[])
}
ただし、エラーは解決しません。どうやら、JsonSlurper
それを考えると、強制をまったく使用していません
println("my-bar" as Foo)
必要に応じて印刷Bar
します。
ここで何が起こっているのですか?ケース名以外JsonSlurper
で正しい列挙型ケースを選択するにはどうすればよいですか?
PS: 興味深いことに、最後から 2 番目の行を次のように変更すると、
new JsonSlurper().parseText('{ "foo" : "my-bar" }') as SomeCmd
スクリプトは を出力しnull
ます。