Как повторно использовать длину поля в форме, валидации и ddl? - PullRequest
6 голосов
/ 30 ноября 2009

Я работаю над приложением Spring с большим количеством форм ввода. Я хотел бы повторно использовать длину поля в аннотации UI-формы, валидации и JPA. Есть ли элегантный способ решить эту проблему. Мое решение на данный момент состоит в том, чтобы использовать константы для объявления длины:

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

   @Column(length=FIRSTNAME_LENGTH)
   private String firstName;

   ...
}

, а затем повторно использовать константу в валидаторе и Jsp

...

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

...

что довольно многословно.

Есть ли более элегантное решение этой проблемы?

Ответы [ 3 ]

11 голосов
/ 22 декабря 2009

Вполне возможно получить доступ к информации, хранящейся в аннотациях. Фактически, это их основная цель: хранение метаинформации в классе / методе / поле. Вот пример того, как получить доступ к длине, хранящейся в аннотации @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());
   }
}

Вы должны иметь возможность создать какой-либо пользовательский тег или компонент для общего извлечения этой информации.

Нетрудно создавать свои собственные аннотации. Вы могли бы рассмотреть возможность создания поля, которое определяет, какие поля должны быть включены в форму, как они должны отображаться, описание и т. Д. Чем вы можете создать общую форму. Опять же, вам может не понравиться смешивать домен и презентацию.

1 голос
/ 18 декабря 2009

Я задавал похожий вопрос, когда использовал Hibernate,

Получение длины столбца из отображений Hibernate?

Однако не знаю, как получить эту информацию из JPA, но если вы используете Hibernate в качестве базового слоя, вы можете попробовать получить доступ к Hibernate напрямую и реализовать решение, описанное выше.

Однако решение Hibernate столь же не элегантно, как и решение, которое вы обрисовали в своем ответе, с дополнительным недостатком, заключающимся в том, что оно связывает вашу реализацию JPA с Hibernate.

0 голосов
/ 09 января 2014

Решение, предоставленное EJB, считывает аннотированное значение для длины столбца. Джеймс МакМахон отметил, что это раскрывает реализацию Hibernate. Это можно решить довольно просто с помощью методов получения. Предполагая, что есть интерфейс для Person с объявленным методом 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();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...