2012-02-25 15 views
1

私はエラーが投げ出されるの下に、プロパティのクラス名を取得しようとすると、私はその後、StringオブジェクトにBeanのプロパティを設定します。Stringオブジェクトのクラス名を取得する方法は?

期待ハッシュを。 plist [0] .javaTypeは、ibatis/macro.ftlの7行26列目のfreemarker.template.SimpleScalarの代わりに評価されました。

テンプレートコードは以下の通りです:

プロパティのJavaTypeはJava Beanに設定されている
<#assign clsName=plist[0].javaType.class.name> 

、クラス名が適切になったことができます。それはなぜです?私は、任意の型、Java Bean、非Java Beanを与えることができるプロパティを必要とします。

答えて

1

ここでの問題の根本は、FreeMarkerがJavaの値/オブジェクトで直接動作しないことです。テンプレート言語には独自のシンプルな型システムがあり、外部から来るものはオブジェクトラッピングと呼ばれる手法によってマッピングされます。 (外側から来ていない値には、内部にラップされたオブジェクトもありません)。オブジェクトのクラスを引き続き取得できたということは、まったく偶然です...何が起こるかは、オブジェクトラッピング機構が、オブジェクトは "hash" FreeMarker型にマップされ、ハッシュ項目はオブジェクトのJavaBeanプロパティに対応します。オブジェクトにはgetClass()メソッドがあります。これは(誤って)「クラス」プロパティのゲッターと見なされます。

クラスを取得する普遍的な方法はありません。時にはクラスがないために、他にもあります。そうするには十分な努力をしているTemplateMethodModelExと書くことができます。

+0

freemarker関数のように動作するTemplateMethodModelExのexecメソッドを実装することを意味しますか? fmがすべてのクラス名を自然に取得できないということは、Javaでコード化されていて、Javaで動作し、javaの多くの関数(メソッド)を持っていると聞くのは奇妙です。 – user1231111

+0

テンプレート言語はJavaでは*実装されていますが、Javaの型/クラスは使用しません。文字列がある場合と同様に、 '.length()'はありません。これは、String以外のJavaオブジェクトを文字列として公開する可能性があり、そのオブジェクトは透過的な状態を維持する必要があるからです。とにかく、クラス名を取得しようと努力することができます(値が 'TemplateModelAdapter'などを実装しているかどうかを確認してください)。これはおそらくあなたの特定のアプリケーションにとっては十分ですが、FMが使用されるあらゆる場所で機能する解決策はありません。したがって、これはテンプレート言語には何もありません。 – ddekany

+0

こんにちはddekany、あなたは私に値を決定する方法のサンプルを教えてくださいTemplateModelAdapterを実装する?ありがとう。 – user1231111

関連する問題