2012-02-25 46 views
1

我設置一個bean的屬性,以一個String對象,然後當我試圖讓該屬性的類名,以下錯誤拋出:如何獲取String對象的類名?

預期哈希值。 plist [0] .javaType在ibatis/macro.ftl的第7行第26列中被評估爲freemarker.template.SimpleScalar。

模板的代碼如下:

<#assign clsName=plist[0].javaType.class.name> 

當屬性JavaType是設置爲一個Java bean,類名可以正確得到。爲什麼?我需要的屬性可以是任何類型,java bean,非java bean。

回答

1

問題的根源在於FreeMarker不直接與Java值/對象一起工作。模板語言有它自己的簡單類型系統,而來自外部的東西通過稱爲對象包裝的技術被映射到該類型系統。 (不是來自外部的值甚至沒有內部包裝的對象。)你仍然能夠獲得某個對象的類純粹是偶然的......會發生什麼事是對象包裝機制決定對象應該映射到「散列」FreeMarker類型,並且散列項目將對應於對象的JavaBean屬性。該對象具有getClass()方法,該方法(錯誤地)被視爲「類」屬性的獲取者。

因此,沒有通用的方法來獲得課程...等等,因爲有時候沒有課程可以獲得。你可以寫一個TemplateMethodModelEx,做足夠的努力來做到這一點。

+0

你的意思是實現TemplateMethodModelEx的exec方法,它的工作原理與freemarker函數一樣嗎?聽到fm無法自然地獲得所有類名是很奇怪的,畢竟它是用java編碼的,與java一起工作的,並且有很多java的函數(方法)。 – user1231111 2012-02-26 06:20:34

+0

模板語言是*在Java中實現的,但不使用Java類型/類。就像你有一個字符串一樣,你沒有'.length()'。這是因爲您可能會將非字符串Java對象作爲字符串公開,並且應該保持透明。無論如何,您仍然可以努力獲取類名(請參閱該值是否實現了'TemplateModelAdapter'等),這對您的特定應用程序來說可能足夠好,但是沒有解決方案適用於每個使用FM的地方。因此,模板語言中沒有任何內容。 – ddekany 2012-02-26 10:25:27

+0

嗨ddekany,你可以請給我一個關於如何確定實現TemplateModelAdapter的值的示例?謝謝。 – user1231111 2012-02-27 01:29:48