문제

많은 입력 양식이있는 스프링 애플리케이션 작업을하고 있습니다. 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();
   }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top