Pregunta

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

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

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

y luego reutilice la constante en el Validador y el Jsp

...

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

...

que es bastante detallado.

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

¿Fue útil?

Solución

Es muy posible acceder a la información almacenada en anotaciones. De hecho, este es su propósito principal: almacenar metainformación en una clase / método / campo. Aquí hay 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());
   }
}

Debería poder crear alguna etiqueta personalizada o bean para extraer esta información genéricamente.

No es difícil crear tus 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. Luego, podría crear un formulario genérico. Por otra parte, es posible que no le guste mezclar dominio y presentación.

Otros consejos

Hice una pregunta similar cuando estaba usando Hibernate,

  

¿Cómo obtener la longitud de columna de las asignaciones de Hibernate?

Sin embargo, no tengo idea de cómo extraer esta información bajo JPA, pero si está utilizando Hibernate como su capa subyacente, puede intentar acceder a Hibernate directamente e implementar la solución anterior.

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

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 los métodos getter. Suponiendo que haya una interfaz para Persona con un método declarado 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();
   }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top