如何从Velocity模板访问对象的公共字段

时间:2013-06-12 14:51:43

标签: java field velocity public vtl

这是我的对象类:

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>

是否可以在不添加getter的情况下访问Velocity对象的公共字段?

3 个答案:

答案 0 :(得分:4)

默认不是。您需要配置不同的Uberspect实现。

答案 1 :(得分:4)

Velocity user guide表明这是不可能的。引用:

  

[Velocity]根据几个已建立的命名约定尝试不同的替代方案。确切的查找顺序取决于属性名称是否以大写字母开头。对于小写名称,例如$ customer.address,序列为

  1. 的getAddress()
  2. 的getAddress()
  3. 得到( “地址”)
  4. isAddress()
  5.   

    对于像$ customer.Address这样的大写属性名称,它略有不同:

    1. 的getAddress()
    2. 的getAddress()
    3. 得到( “地址”)
    4. isAddress()

答案 2 :(得分:0)

我愿意

import org.apache.velocity.util.introspection.UberspectImpl;
import org.apache.velocity.util.introspection.UberspectPublicFields;

....

properties.setProperty("runtime.introspector.uberspect",
  UberspectImpl.class.getName() + ", " +
  UberspectPublicFields.class.getName());

一切正常!!!