2009-11-29 5 views
6

Ich arbeite an einer Spring-Anwendung mit vielen Eingabeformularen. Ich möchte die Feldlänge in den UI-Formular-, Validierungs- und JPA-Annotationen wiederverwenden. Gibt es einen eleganten Weg, dies zu lösen? Meine Lösung ist im Moment, Konstanten zu verwenden, um die Länge zu erklären:Wie Feldlänge in Formular, Validierung und ddl wiederverwenden?

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

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

und dann die Konstante in der Validator und der Jsp

... 

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

... 

die ausführliche ist ziemlich wiederzuverwenden.

Gibt es eine elegantere Lösung für dieses Problem?

+0

sieht für mich ok aus. – pstanton

+0

Dominik, deine "in-elegante" Lösung sieht ziemlich clever aus. Ich muss das vielleicht benutzen. Gute Frage, egal, das ist etwas, was jeder tun muss, aber es scheint keine Lösung dafür zu geben. –

+0

Ich bin froh, dass Sie hier ein Kopfgeld machen, ich möchte sehen, dass dies auch beantwortet wird. Ich wünschte, sie hätten ein Feature für Community Bounties, ich würde einen Teil meiner Representation einwerfen. –

Antwort

10

Es ist durchaus möglich, auf die in Annotationen gespeicherten Informationen zuzugreifen. In der Tat ist dies ihr Hauptzweck: Meta-Informationen zu einer Klasse/Methode/Feld zu speichern. Hier ist ein Beispiel dafür, wie die Länge in einer @Column Anmerkung gespeichert zuzugreifen:

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()); 
    } 
} 

sollten Sie in der Lage sein, einigen benutzerdefinierten Tag oder Bohnen erstellen allgemein diese Informationen zu extrahieren.

Es ist nicht schwer, eigene Anmerkungen zu erstellen. Sie könnten in Erwägung ziehen, eine zu erstellen, die angibt, welche Felder in das Formular aufgenommen werden sollen, wie sie gerendert werden sollen, Beschreibung usw. Es könnte ein generisches Formular erstellt werden. Andererseits möchten Sie Domain und Präsentation möglicherweise nicht mischen.

+0

Das ist eine ziemliche Grenze, die berühmte Java-Knappheit ist lebendig und wohlauf. Toller Tipp, danke. –

+0

Nur ein Nachfolger, java.lang.Class.getDeclaredField() löst zwei geprüfte Ausnahmen aus, NoSuchFieldException und SecurityException. Dies macht diese Methode ein wenig klobiger und ist etwas zu beachten, wenn Sie versuchen, diese Lösung zu implementieren. –

1

fragte ich eine ähnliche Frage, wenn ich Hibernate,

Getting column length from Hibernate mappings?

Keine Ahnung, wie diese Informationen unter JPA ziehen jedoch wurde mit, aber wenn Sie Hibernate als darunter liegende Schicht verwenden Sie könnte versuchen, direkt auf Hibernate zuzugreifen und die obige Lösung zu implementieren.

Die Hibernate-Lösung ist jedoch genauso elegant wie die Lösung, die Sie in Ihrer Antwort beschrieben haben, mit dem zusätzlichen Nachteil, dass sie Ihre JPA-Implementierung an Hibernate bindet.

0

Die von EJB bereitgestellte Lösung liest den annotierten Wert für die Spaltenlänge. James McMahon wies darauf hin, dass dies die Implementierung von Hibernate aufdeckt. Das kann ziemlich einfach mit Getter-Methoden gelöst werden. Angenommen, es gibt eine Schnittstelle für Person mit einer deklarierten Methode 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(); 
    } 
}