2013-06-12 7 views
7

Oto moja klasa obiektu:Jak uzyskać dostęp do pól publicznych obiekt jest z szablonu 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; 
    } 
} 

dodaję go do kontekstu prędkości tak:

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

Jednak pisząc szablon , następujące elementy nie będą renderować pól adresu (jednak działa poprawnie, gdy dodaję moduły pobierające do klasy adresu)

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

Czy można uzyskać dostęp do pól publicznych na obiektach z Velocity bez dodawania getterów?

Odpowiedz

4

Nie domyślnie. Musisz skonfigurować inną implementację Uberspect.

+0

Czy możesz dodać wszelkie szczegóły, takie jak link do dokumentacji, jak to zrobić lub dlaczego jest to konieczne? –

+2

Jest to konieczne, ponieważ prędkość nie obsługuje pól publicznych. Wypróbuj to: http://maven-doccheck.sourceforge.net/samples/ShinobuDemo/apidocs/org/apache/velocity/tools/generic/introspection/PublicFieldUberspect.html –

+0

To genialne, że implementują swoją strukturę zgodnie z konwencją zamiast rzeczywistych reguł językowych ... – evanmcdonnal

3

The Velocity user guide sugeruje, że nie jest to możliwe. Cytat:

[Velocity] próbuje różnych alternatyw w oparciu o kilka ustalonych konwencji nazewnictwa. Dokładna kolejność wyszukiwania zależy od tego, czy nazwa właściwości zaczyna się od dużej litery, czy nie. W przypadku nazw małymi, takich jak $ customer.address sekwencja jest

  1. getAddress()
  2. getAddress()
  3. get ("adres")
  4. isAddress()

Na górnym nazwy właściwości, takich jak $ customer.Address, jest nieco inna:

  1. getAddress()
  2. getAddress()
  3. get ("Address")
  4. isAddress()
0

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

Q: Jak mogę uzyskać dostęp do pola publiczne mojego obiektu w moich szablonach?

A: Obecnie dostępne są trzy opcje:

  • owinąć obiekt o FieldMethodizer

  • Skonfiguruj VelocityEngine użyć niestandardowego uberspector jak PublicFieldUberspect

  • Lobby prędkość -dev pozwala dodać introspekcję dziedzinową jako domyślną rezerwę, jeśli nie zostanie znaleziona pasująca metoda :)

FieldMethodizer działa tylko z publicznymi polami statycznymi.

PublicFieldUberspect przykładowy kod jest dość stary i kończy się niepowodzeniem z błędem w nieistniejących polach.

I zapomnij o lobby na liście deweloperów.)


Tymczasem, nie jest dobre buforowanie implementation z UberspectPublicFields w bieżącym velocity trunk. Niestety, opublikowano no active development for years i nie są planowane kolejne wersje. Trzeba byłoby samemu go zbudować i spakować w prywatne repozytorium.


Innym altervative jest widelec z kompatybilności scala premia, która jest dostępna w centralnym repozytorium maven: http://maven-repository.com/artifact/com.sksamuel.scalocity/scalocity/0.9.

Spadek zamiast zwykłej zależność prędkości:

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

Następnie wystarczy dodać do velocity.properties:

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

Zastrzeżenie to że UberspectImpl jest połatany z dodatkowym wsparciem dla właściwości Scali i wymaga 8 MB Scala słoik.


Ostatecznie, po prostu internowany następujących klas z prędkością tułowia do własnego projektu:

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

Te drobne prace z Velocity 1.7.

Powiązane problemy