2009-11-29 5 views
6

Je travaille sur une application Spring avec beaucoup de formulaires de saisie. Je souhaite réutiliser la longueur du champ dans le formulaire d'interface utilisateur, la validation et les annotations JPA. Y a-t-il une manière élégante de résoudre ceci. Ma solution au moment est, d'utiliser des constantes de déclarer la longueur:Comment réutiliser fieldlength dans form, validation et ddl?

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

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

puis réutiliser la constante dans le validateur et que la Jsp

... 

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

... 

qui est assez bavard.

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

+0

me semble ok. – pstanton

+0

Dominik, votre solution "élégante" me semble plutôt intelligente. Je peux devoir utiliser cela. Bonne question malgré tout, c'est quelque chose que tout le monde a à faire mais il ne semble pas y avoir de solution intégrée pour cela. –

+0

Je suis heureux que vous ayez mis une prime ici, je veux voir cette réponse aussi bien. Je souhaite qu'ils avaient une fonctionnalité pour les primes de la communauté, je voudrais jeter dans certains de mes représentants. –

Répondre

10

Il est tout à fait possible d'accéder aux informations stockées dans les annotations. En fait, c'est leur but principal: stocker des méta-informations sur une classe/méthode/champ. Voici un exemple de la façon d'accéder à 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 être en mesure de créer une étiquette personnalisée ou de haricots pour extraire cette information génériquement.

Il n'est pas difficile de créer vos propres annotations. Vous pourriez envisager de créer un qui spécifie quels champs doivent être inclus sur le formulaire, comment ils devraient être rendus, description, etc. Que vous pourriez créer un formulaire générique. Là encore, vous ne pouvez pas aimer mélanger le domaine et la présentation.

+0

C'est tout à fait une ligne pleine, la célèbre connectivité Java est bien vivante. Bon conseil, merci. –

+0

Juste un suivi, java.lang.Class.getDeclaredField() jette deux exceptions vérifiées, NoSuchFieldException et SecurityException. Cela rend cette méthode un peu plus maladroite et est quelque chose à garder à l'esprit si vous essayez d'implémenter cette solution. –

1

j'ai posé une question similaire quand j'utilisais Hibernate,

Getting column length from Hibernate mappings?

Aucune idée comment tirer cette information sous JPA cependant, mais si vous utilisez Hibernate comme couche sous-jacente vous pourrait essayer d'accéder directement à Hibernate et implémenter la solution ci-dessus.

Cependant, la solution Hibernate est tout aussi élégante que la solution que vous avez décrite dans votre réponse, avec l'inconvénient supplémentaire qu'elle lie votre implémentation JPA à Hibernate.

0

La solution apportée par EJB lit la valeur annoté de la longueur de la colonne. James McMahon a souligné que cela expose l'implémentation d'Hibernate. Cela peut être résolu assez simplement avec les méthodes getter. En supposant qu'il existe une interface pour la personne 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(); 
    } 
} 
Questions connexes