質問

私は、多くの入力フォームを備えた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を使用していたときに同様の質問をしました

  

Hibernateマッピングから列の長さを取得しますか?

ただし、JPAでこの情報を取得する方法はわかりませんが、Hibernateを基層として使用している場合は、Hibernateに直接アクセスして上記のソリューションを実装できます。

ただし、Hibernateソリューションは、回答で説明したソリューションと同じように洗練されていませんが、JPA実装をHibernateに結び付けるという欠点もあります。

EJBが提供するソリューションは、列の長さの注釈付き値を読み取ります。 James McMahonは、これによりHibernate実装が公開されることを指摘しました。これは、ゲッターメソッドでかなり簡単に解決できます。宣言されたメソッドgetFirstNameLengthを持つPersonのインターフェースがあると仮定します:

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