2009-11-29 5 views
6

Pracuję nad aplikacją Spring z dużą ilością formularzy wejściowych. Chciałbym ponownie użyć długości pola w adnotacjach w formularzu UI, sprawdzaniu poprawności i w JPA. Czy istnieje elegancki sposób rozwiązania tego problemu. Moje rozwiązanie w tej chwili jest, aby używać stałych zadeklarować długość:Jak ponownie wykorzystać długość pola w formularzu, sprawdzeniu poprawności i ddl?

public class Person 
{ 
    public static final int FIRSTNAME_LENGTH = 25; 

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

a następnie ponowne stała w Validator i JSP

... 

<form:input path="firstName" 
    maxlength="<%= Integer.toString(Person.FIRSTNAME_LENGTH) %>"/> 

... 

który jest dość rozwlekły.

Czy istnieje bardziej eleganckie rozwiązanie tego problemu?

+0

wygląda dla mnie dobrze. – pstanton

+0

Dominik, twoje "eleganckie" rozwiązanie wygląda na całkiem sprytne. Być może będę musiał tego użyć. Dobre pytanie, niezależnie od tego, jest to coś, co każdy musi zrobić, ale wydaje się, że nie ma w nim wbudowanego rozwiązania. –

+0

Cieszę się, że włożyłeś tutaj nagrodę, ja też chcę odpowiedzieć na to pytanie. Szkoda, że ​​nie mają funkcji na nagrody społecznościowe, wrzuciłbym część mojego przedstawiciela. –

Odpowiedz

10

Dostęp do informacji zapisanych w adnotacjach jest całkiem możliwy. W rzeczywistości jest to ich główny cel: przechowywanie meta informacji o klasie/metodzie/polu. Oto przykład, w jaki sposób uzyskać dostęp do przechowywanych w długości adnotacji @Column:

import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
public class Person { 

    @Column(length=30) 
    private String firstName; 

    public static void main(String[] args) throws SecurityException, NoSuchFieldException { 
     Object person = new Person(); 
     //find out length  
     System.out.println(person.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length()); 
    } 
} 

powinna być w stanie stworzyć jakiś niestandardowy znacznik lub fasolkę, aby wyodrębnić te informacje rodzajowo.

Tworzenie własnych adnotacji nie jest trudne. Można rozważyć utworzenie takiego, które określa, które pola mają być zawarte w formularzu, jak powinny być renderowane, opis itp. Następnie można utworzyć formularz ogólny. Z drugiej strony możesz nie chcieć mieszać domeny i prezentacji.

+0

To całkiem spora linia, słynna lapidarność Java jest żywa i dobrze. Świetna wskazówka, dziękuję. –

+0

Po wykonaniu polecenia java.lang.Class.getDeclaredField() generuje dwa sprawdzone wyjątki: NoSuchFieldException i SecurityException. To sprawia, że ​​ta metoda jest trochę bardziej niezgrabna i należy o tym pamiętać, jeśli próbujesz wdrożyć to rozwiązanie. –

1

zadałem podobne pytanie, kiedy przy użyciu hibernacji,

Getting column length from Hibernate mappings?

Nie mam pojęcia jak wyciągnąć te informacje pod JPA jednak, ale jeśli używasz Hibernacja jako podstawowej warstwy, może spróbować bezpośrednio przejść do Hibernate i wdrożyć powyższe rozwiązanie.

Jednak rozwiązanie Hibernate jest tak samo eleganckie jak rozwiązanie opisane w odpowiedzi, z dodatkową wadą polegającą na powiązaniu implementacji JPA z Hibernate.

0

Rozwiązanie dostarczone przez EJB odczytuje adnotowaną wartość dla długości kolumny. James McMahon zwrócił uwagę, że ujawnia to implementację Hibernacji. Można to rozwiązać po prostu za pomocą metod getter. Zakładając, że istnieje interfejs dla osoby o zadeklarowanej metodzie getFirstNameLength:

import javax.persistence.Column; 
import javax.persistence.Entity; 

@Entity 
public class PersonImplementation extends Person { 

    @Column(length=30) 
    private String firstName; 

    public int getFirstNameLength() { 
     return this.getClass().getDeclaredField("firstName").getAnnotation(Column.class).length(); 
    } 
} 
Powiązane problemy