FieldLength를 양식, 검증 및 DDL로 재사용하는 방법은 무엇입니까?
-
08-07-2019 - |
문제
많은 입력 양식이있는 스프링 애플리케이션 작업을하고 있습니다. 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을 만들 수 있어야합니다.
자신의 주석을 만드는 것은 어렵지 않습니다. 일반적인 양식을 만들 수있는 것보다 양식에 포함될 필드, 렌더링 방법, 설명 등을 지정하는 것을 작성하는 것을 고려할 수 있습니다. 그런 다음 다시 도메인과 프리젠 테이션을 혼합하지 않을 수도 있습니다.
다른 팁
최대 절전 모드를 사용할 때 비슷한 질문을했습니다.
그러나이 정보를 JPA 아래에서 가져 오는 방법을 모르지만 최대 절전 모드를 기본 레이어로 사용하는 경우 최대 절전 모드에 직접 액세스하고 위의 솔루션을 구현할 수 있습니다.
그러나 최대 절전 모드 솔루션은 귀하의 답변에 요약 한 솔루션만큼이나 유선이며, JPA 구현과 동면에 연결되는 단점이 있습니다.
EJB가 제공하는 솔루션은 열 길이에 대한 주석이 달린 값을 읽습니다. 제임스 맥 마혼 (James McMahon)은 이것이 최대 절전 모드 구현을 노출한다고 지적했다. 그것은 Getter 방법으로 간단하게 해결할 수 있습니다. 선언 된 메소드가있는 사람에 대한 인터페이스가 있다고 가정하면 다음과 같은 이름이 있습니다.
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();
}
}