2009-11-29 5 views
6

Estoy trabajando en una aplicación Spring con muchos formularios de entrada. Me gustaría reutilizar la longitud del campo en la forma de UI, la validación y las anotaciones JPA. ¿Hay una forma elegante de resolver esto? Mi solución en este momento es, para utilizar constantes de declarar la longitud:¿Cómo reutilizar la longitud de campo en forma, validación y ddl?

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

    @Column(length=FIRSTNAME_LENGTH) 
    private String firstName; 

    ... 
} 

y luego volver a utilizar la constante en el validador y la JSP

... 

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

... 

que es bastante detallado.

¿Hay alguna solución más elegante a este problema?

+0

se ve bien para mí. – pstanton

+0

Dominik, su solución "elegante" parece muy inteligente para mí. Puede que tenga que usar eso. Buena pregunta independientemente, esto es algo que todo el mundo tiene que hacer, pero no parece haber sido construido en la solución para ello. –

+0

Me alegra que pongas una recompensa aquí, quiero ver que esto también responda. Desearía que tuvieran una característica para las bondades de la comunidad, yo agregaría algunos de mis representantes. –

Respuesta

10

Es muy posible acceder a la información almacenada en las anotaciones. De hecho, este es su principal objetivo: almacenar metainformación en una clase/método/campo. Aquí es un ejemplo de cómo acceder a la longitud almacenada en una anotación @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()); 
    } 
} 

usted debería ser capaz de crear un poco de etiqueta personalizada o frijol para extraer esta información de forma genérica.

No es difícil crear sus propias anotaciones. Podría considerar crear uno que especifique qué campos se incluirán en el formulario, cómo se deben representar, descripción, etc. de lo que podría crear un formulario genérico. Por otra parte, puede que no le guste mezclar dominio y presentación.

+0

Esa es una línea completa, la famosa concisión de Java está viva y coleando. Un gran consejo, gracias. –

+0

Solo un seguimiento, java.lang.Class.getDeclaredField() arroja dos excepciones comprobadas, NoSuchFieldException y SecurityException. Esto hace que este método sea un poco más torpe y es algo a tener en cuenta si está tratando de implementar esta solución. –

1

me hizo una pregunta similar cuando yo estaba usando Hibernate,

Getting column length from Hibernate mappings?

Ni idea de cómo sacar esta información bajo la APP sin embargo, pero si usted está usando Hibernate como la capa subyacente se podría intentar acceder a Hibernate directamente e implementar la solución anterior.

Sin embargo, la solución Hibernate es tan elegante como la solución que describió en su respuesta, con la desventaja adicional de que une su implementación de JPA a Hibernate.

0

La solución proporcionada por EJB lee el valor anotado para la longitud de la columna. James McMahon señaló que esto expone la implementación de Hibernate. Eso se puede resolver de manera bastante simple con métodos getter. Suponiendo que hay una interfaz para la persona con un getFirstNameLength método declarado:

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