Domanda

Sto lavorando a un'applicazione Spring con molti moduli di input. Vorrei riutilizzare la lunghezza del campo nel modulo dell'interfaccia utente, nella convalida e nelle annotazioni JPA. Esiste un modo elegante per risolvere questo. La mia soluzione al momento è usare costanti per dichiarare la lunghezza:

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

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

e quindi riutilizzare la costante in Validator e Jsp

...

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

...

che è piuttosto dettagliato.

Esiste una soluzione più elegante a questo problema?

È stato utile?

Soluzione

È possibile accedere alle informazioni memorizzate nelle annotazioni. In effetti, questo è il loro scopo principale: memorizzare meta informazioni su una classe / metodo / campo. Ecco un esempio di come accedere alla lunghezza memorizzata 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());
   }
}

Dovresti essere in grado di creare tag o bean personalizzati per estrarre queste informazioni genericamente.

Non è difficile creare le tue annotazioni. Si potrebbe prendere in considerazione la possibilità di crearne uno che specifichi quali campi devono essere inclusi nel modulo, come devono essere resi, descrizione, ecc. Di quanto si possa creare un modulo generico. Quindi potresti non voler mescolare dominio e presentazione.

Altri suggerimenti

Ho fatto una domanda simile quando stavo usando Hibernate,

  

Ottenere la lunghezza della colonna dalle mappature di ibernazione?

Non ho idea di come estrarre queste informazioni in JPA, ma se stai usando Hibernate come livello sottostante puoi provare ad accedere direttamente a Hibernate e implementare la soluzione sopra.

Tuttavia la soluzione Hibernate è altrettanto elegante come la soluzione che hai indicato nella tua risposta, con l'ulteriore svantaggio che lega l'implementazione di JPA a Hibernate.

La soluzione fornita da EJB legge il valore annotato per la lunghezza della colonna. James McMahon ha sottolineato che ciò espone l'implementazione di Hibernate. Questo può essere risolto abbastanza semplicemente con metodi getter. Supponendo che esista 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();
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top