2013-06-12 102 views
7

這裏訪問對象的公共領域是我的對象類:如何從Velocity模板

public class Address 
{ 
    public final String line1; 
    public final String town; 
    public final String postcode; 

    public Address(final String line1, final String town, final String postcode) 
    { 
     this.line1 = line1; 
     this.town = town; 
     this.postcode = postcode; 
    } 
} 

我把它添加到速度情況下是這樣的:

Address theAddress = new Address("123 Fake St", "Springfield", "SP123"); 
context.put("TheAddress", theAddress); 

然而,寫作模板時,下面將不會渲染地址字段(但是,當我將getter添加到Address類時它工作正常)

<Address> 
    <Line1>${TheAddress.line1}</Line1> 
    <Town>${TheAddress.town}</Town> 
    <Postcode>${TheAddress.postcode}</Postcode> 
</Address> 

是否可以從Velocity訪問公共字段而不添加getters?

回答

4

不是默認情況下。您需要配置不同的Uberspect實現。

+0

你可以添加任何細節,如鏈接到文檔如何做到這一點或爲什麼這是必要的? –

+2

這是必要的,因爲Velocity不支持公共字段。 試試這個:http://maven-doccheck.sourceforge.net/samples/ShinobuDemo/apidocs/org/apache/velocity/tools/generic/introspection/PublicFieldUberspect.html –

+0

他們很棒,他們按照慣例實現他們的框架而不是實際的語言規則...... – evanmcdonnal

3

Velocity user guide表明這是不可能的。 Quote:

[速度]嘗試不同的替代品,基於幾個既定的命名約定。確切的查找順序取決於屬性名稱是否以大寫字母開頭。對於小寫的名稱,如$ customer.address,序列

  1. 的getAddress()
  2. 的getAddress()
  3. GET( 「地址」)
  4. isAddress()

對於像$ customer.Address大寫的屬性名稱,它是略有不同:

  1. 的getAddress()
  2. 的getAddress()
  3. GET( 「地址」)
  4. isAddress()
0

http://wiki.apache.org/velocity/VelocityFAQ

問:我如何可以訪問我的對象的公共字段在我的模板?

答:目前,你有三種選擇:

  • 包裝你的對象有FieldMethodizer

  • 配置您VelocityEngine使用自定義uberspector像PublicFieldUberspect

  • 大堂速度-dev列表添加公共字段自省作爲默認回退如果沒有找到匹配的方法:)

FieldMethodizer僅適用於公共靜態字段。

PublicFieldUberspect示例代碼相當陳舊,它只是在不存在的字段上發生錯誤而失敗。

而忘記在開發名單大廳。 )


與此同時,在當前velocity trunk良好的緩存UberspectPublicFieldsimplementation。不幸的是,有no active development for years,並沒有發佈下一個版本的計劃。 你必須自己構建它並捆綁到私有存儲庫中。


另一個altervative是與獎金階兼容性叉即在中央行家存儲庫中可用: http://maven-repository.com/artifact/com.sksamuel.scalocity/scalocity/0.9

掉落在代替通常的速度依賴性:

<dependency> 
    <groupId>com.sksamuel.scalocity</groupId> 
    <artifactId>scalocity</artifactId> 
    <version>0.9</version> 
</dependency> 

然後,只需添加到velocity.properties

runtime.introspector.uberspect = org.apache.velocity.util.introspection.UberspectPublicFields, org.apache.velocity.util.introspection.UberspectImpl 

需要說明的是UberspectImpl修補與階性質額外的支持和需要8 MB階罐。


最後,我剛剛從實習幹線速度以下類別爲自己的項目:

org.apache.velocity.runtime.parser.node.PublicFieldExecutor org.apache.velocity.runtime。 parser.node.SetPublicFieldExecutor org.apache.velocity.util.introspection.ClassFieldMap org.apache.velocity.util.introspection.Introspector org.apache.velocity.util.introspection.IntrospectorBase org.apache.velocity.util。 introspection.IntrospectorCache 個org.apache.velocity.util.introspection.IntrospectorCacheImpl org.apache.velocity.util.introspection.UberspectPublicFields

這些做工精細用速度1.7。