Как повторно использовать длину поля в форме, валидации и ddl?
-
08-07-2019 - |
Вопрос
Я работаю над приложением 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) %>"/>
...
что довольно многословно. Р>
Есть ли более элегантное решение этой проблемы?
Решение
Вполне возможно получить доступ к информации, хранящейся в аннотациях. Фактически, это их основная цель: хранение метаинформации в классе / методе / поле. Вот пример того, как получить доступ к длине, хранящейся в аннотации @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());
}
}
Вы должны иметь возможность создать какой-либо пользовательский тег или компонент для общего извлечения этой информации.
Нетрудно создавать свои собственные аннотации. Вы можете рассмотреть возможность создания поля, которое определяет, какие поля должны быть включены в форму, как они должны отображаться, описание и т. Д. Чем вы можете создать общую форму. Опять же, вам может не понравиться смешивать домен и презентацию.
Другие советы
Я задал похожий вопрос, когда использовал Hibernate,
Однако я не знаю, как получить эту информацию из JPA, но если вы используете Hibernate в качестве базового слоя, вы можете напрямую обратиться к Hibernate и реализовать решение, описанное выше.
Однако решение Hibernate столь же не элегантно, как и решение, которое вы обрисовали в своем ответе, с дополнительным недостатком, заключающимся в том, что он связывает вашу реализацию JPA с Hibernate.
Решение, предоставленное 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();
}
}