2009-11-29 11 views
6

Sto lavorando a un'applicazione Spring con molti moduli di input. Vorrei riutilizzare la lunghezza del campo nelle annotazioni sul modulo UI, sulla convalida e JPA. C'è un modo elegante per risolvere questo. La mia soluzione in questo momento è, per usare le costanti di dichiarare la lunghezza:Come riutilizzare fieldlength in form, validation e ddl?

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

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

e quindi riutilizzare il costante nel Validator e Jsp

... 

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

... 

che è abbastanza prolisso.

Esiste una soluzione più elegante a questo problema?

+0

sembra a me. – pstanton

+0

Dominik, la tua soluzione "elegante" mi sembra abbastanza intelligente. Potrei doverlo usare. Bella domanda a prescindere, questo è qualcosa che tutti devono fare, ma non sembra esserci una soluzione per questo. –

+0

Sono felice che tu abbia messo una taglia qui, voglio vedere anche questa risposta. Vorrei che avessero una caratteristica per le munificenze della comunità, avrei buttato dentro alcuni dei miei rappresentanti. –

risposta

10

È possibile accedere alle informazioni memorizzate nelle annotazioni. In realtà, questo è il loro scopo principale: la memorizzazione di meta informazioni su una classe/metodo/campo. Ecco un esempio di come accedere alla lunghezza memorizzato in un'annotazione @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()); 
    } 
} 

si dovrebbe essere in grado di creare qualche tag personalizzato o di fagioli per estrarre queste informazioni generico.

Non è difficile creare le proprie annotazioni. Potresti considerare di crearne uno che specifichi quali campi devono essere inclusi nel modulo, come dovrebbero essere resi, descrizione, ecc. Di quanto potresti creare un modulo generico. Inoltre, potresti non gradire il mix di dominio e presentazione.

+0

Questa è una linea abbastanza piena, la famosa tonalità Java è viva e vegeta. Ottimo consiglio, grazie. –

+0

Solo un seguito, java.lang.Class.getDeclaredField() genera due eccezioni controllate, NoSuchFieldException e SecurityException. Questo rende questo metodo un po 'più goffo ed è qualcosa da tenere a mente se stai cercando di implementare questa soluzione. –

1

ho fatto una domanda simile quando stavo usando Hibernate,

Getting column length from Hibernate mappings?

Non ho idea di come tirare queste informazioni sotto JPA tuttavia, ma se si utilizza Hibernate come strato sottostante si potrebbe provare ad accedere direttamente a Hibernate e implementare la soluzione di cui sopra.

Tuttavia, la soluzione di Hibernate è altrettanto elegante della soluzione che hai delineato nella risposta, con l'ulteriore svantaggio di legare l'implementazione JPA a Hibernate.

0

La soluzione fornita da EJB legge il valore annotato per la lunghezza della colonna. James McMahon ha sottolineato che questo espone l'implementazione di Hibernate. Questo può essere risolto abbastanza semplicemente con metodi getter. Supponendo che ci sia un'interfaccia per Persona con un metodo dichiarato 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(); 
    } 
}