How to access an object's public fields from a Velocity template
Solution 1
Not by default. You need to configure a different Uberspect implementation.
Solution 2
The Velocity user guide suggests it's not possible. Quote:
[Velocity] tries out different alternatives based on several established naming conventions. The exact lookup sequence depends on whether or not the property name starts with an upper-case letter. For lower-case names, such as $customer.address, the sequence is
- getaddress()
- getAddress()
- get("address")
- isAddress()
For upper-case property names like $customer.Address, it is slightly different:
- getAddress()
- getaddress()
- get("Address")
- isAddress()
Alex Spurling
Updated on July 20, 2022Comments
-
Alex Spurling almost 2 years
Here is my object class:
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; } }
I add it to the velocity context like this:
Address theAddress = new Address("123 Fake St", "Springfield", "SP123"); context.put("TheAddress", theAddress);
However, when writing the template, the following will not render the address fields (however, it works fine when I add getters to the Address class)
<Address> <Line1>${TheAddress.line1}</Line1> <Town>${TheAddress.town}</Town> <Postcode>${TheAddress.postcode}</Postcode> </Address>
Is it possible to access public fields on objects from Velocity without adding getters?
-
Alex Spurling about 11 yearsCould you add any details such as link to documentation on how to do this or on why this is neccessary?
-
Scott about 11 yearsIt's necessary because Velocity doesn't support public fields. Try this out: maven-doccheck.sourceforge.net/samples/ShinobuDemo/apidocs/org/…
-
evanmcdonnal about 8 yearsIt's brilliant that they implement their framework according to convention rather than actual language rules...