Frage

Ich arbeite an einem Frühling Anwendung mit vielen Eingabeformularen. Ich möchte die Feldlänge in der UI-Form, Validierung und JPA Anmerkungen wiederzuverwenden. Gibt es eine elegante Möglichkeit, dies zu lösen. Meine Lösung ist im Moment, Konstanten zu verwenden, um die Länge zu deklarieren:

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

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

und dann wieder verwendet die Konstante in dem Validator und die JSP

...

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

...

, die ist ziemlich ausführlich.

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

War es hilfreich?

Lösung

Es ist durchaus möglich, die Informationen in Annotationen gespeichert sind. In der Tat, das ist ihr Hauptzweck: Speicher von Meta-Informationen zu einer Klasse / Methode / Feld. 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());
   }
}

Sie sollten in der Lage sein, einige benutzerdefinierte Tag oder Bohnen zu erstellen, um diese Informationen allgemein zu extrahieren.

Es ist nicht schwierig, Ihre eigenen Anmerkungen zu erstellen. Man könnte die Schaffung einen betrachten, die angibt, welche Felder auf dem Formular enthalten sein, wie sie gemacht werden soll, Beschreibung usw. als Sie eine generische Form schaffen könnte. Dann wieder können Sie nicht wie Domain und Präsentation mischen.

Andere Tipps

Ich fragte eine ähnliche Frage, wenn ich Hibernate wurde mit

  

Erste Spaltenlänge von Hibernate Mappings?

Keine Ahnung, wie diese Informationen unter JPA jedoch ziehen, aber wenn Sie Hibernate als darunter liegende Schicht verwenden können Sie den Zugriff versuchen, direkt Hibernate und die Lösung oben implementieren.

Doch die Hibernate-Lösung ist ebenso in-elegant wie die Lösung, die Sie in Ihrer Antwort skizziert, mit dem zusätzlichen Nachteil, dass es eine enge Anbindung an JPA-Implementierung Hibernate.

Die Lösung von EJB liest den kommentierten Wert für Spaltenlänge zur Verfügung gestellt. James McMahon wies darauf hin, dass dies die Hibernate Implementierung aussetzt. Das kann ziemlich einfach mit Getter-Methoden gelöst werden. Angenommen, es ist eine Schnittstelle zur 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();
   }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top