Я работаю над приложением 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());
}
}
Вы должны иметь возможность создать некоторый собственный тег или bean-компонент для общего извлечения этой информации.
Нетрудно создать свои собственные аннотации. Вы можете подумать о создании поля, которое определяет, какие поля должны быть включены в форму, как они должны отображаться, описание и т. Д. Тогда вы могли бы создать общую форму. С другой стороны, вам может не понравиться смешивать домен и презентацию.
Я задавал аналогичный вопрос, когда использовал Hibernate,
Не знаю, как получить эту информацию из JPA однако, но если вы используете Hibernate в качестве базового уровня, вы можете попробовать получить доступ к Hibernate напрямую и реализовать вышеприведенное решение.
Однако решение Hibernate так же элегантно, как и решение, которое вы изложили в своем ответе, с добавленным Недостатком является то, что он связывает вашу реализацию JPA с Hibernate.