Question

Je travaille sur une application Spring comportant de nombreux formulaires de saisie. J'aimerais réutiliser la longueur du champ dans les annotations JPA, de validation et dans l'interface utilisateur. Y a-t-il une manière élégante de résoudre ceci. Ma solution pour le moment est d'utiliser des constantes pour déclarer la longueur:

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

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

puis réutilisez la constante dans le validateur et le Jsp

...

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

...

qui est assez bavard.

Existe-t-il une solution plus élégante à ce problème?

Était-ce utile?

La solution

Il est tout à fait possible d'accéder aux informations stockées dans les annotations. En fait, c'est leur objectif principal: stocker des méta-informations sur une classe / méthode / champ. Voici un exemple d'accès à la longueur stockée dans une annotation @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());
   }
}

Vous devriez pouvoir créer une balise personnalisée ou un haricot pour extraire ces informations de manière générique.

Il n'est pas difficile de créer vos propres annotations. Vous pouvez en créer un qui spécifie quels champs doivent être inclus dans le formulaire, comment ils doivent être rendus, une description, etc. Vous pouvez créer un formulaire générique. Là encore, vous n’aimerez peut-être pas mélanger le domaine et la présentation.

Autres conseils

J'ai posé une question similaire lorsque j'utilisais Hibernate,

  

Obtenir la longueur de la colonne à partir des mappages Hibernate?

Vous ne savez pas comment extraire ces informations sous JPA, cependant, si vous utilisez Hibernate comme couche sous-jacente, vous pouvez essayer d'accéder directement à Hibernate et de mettre en œuvre la solution ci-dessus.

Toutefois, la solution Hibernate est tout aussi élégante que celle que vous avez décrite dans votre réponse, avec l'inconvénient supplémentaire de lier l'implémentation de votre JPA à Hibernate.

La solution fournie par EJB lit la valeur annotée pour la longueur de colonne. James McMahon a souligné que cela expose la mise en œuvre d'Hibernate. Cela peut être résolu assez simplement avec les méthodes getter. En supposant qu'il existe une interface pour Person avec une méthode déclarée 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();
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top