プレイフレームワーク2 - Scalaテンプレート:一般オブジェクトで特定のメソッドを呼び出す方法

StackOverflow https://stackoverflow.com//questions/22039081

質問

Play Framework 2.1.5をJavaアプリケーションで使用しています。

一般的なオブジェクトのリストをパラメータとして取得するビューコンポーネントを持っています。このコンポーネントでは、リストに繰り返し、各要素のいくつかのプロパティを取得します。

これはこのようなもののように見えます:

@(elements: List[_])

@for((element, i) <- elements.view.zipWithIndex) {
    @i
    @element.id
    @element.name
}
.

(私はそれらの3つの値が必要です)

しかしもちろん、リストに入れるオブジェクトの種類がこれらのメソッドを含んでいても、element.idelement.nameはコンパイルされません。だから私はこれをしました:

@for((element, i) <- elements.view.zipWithIndex) {
    @defining(
        ViewsUtils.getGenericElementId(element),
        ViewsUtils.getGenericElementName(element)) {
            case (id, name, something) =>
                @i
                @id
                @name
        }
}
.

およびJavaユーティリティクラス:

public final class ViewsUtils {

    public static String getGenericElementId(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        return object.getClass().getMethod("getId").invoke(object).toString();
    }

    public static String getGenericElementName(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        return object.getClass().getMethod("getName").invoke(object).toString();
    }
}
.

これは機能していますが、リストに入れるオブジェクトの種類には存在しなかった場合にRuntimeExceptionが存在しないため、正しくないことがわかります。

これは私の座図です:

  1. 要素のキャスティング

  2. 継承の使用

  3. 各オブジェクトの2つのプロパティ(IDと名前)を必要とするので、地図を使うことができましたが、ループのインデックスが必要です(マップから入手可能ですか?)私が2つ以上のプロパティを必要としていれば仕事をしています。

  4. は、この種のものの構文を提供しています。

  5. または多分私は間違った方向を見ているだけです。

    あなたの助けをありがとうございました。

役に立ちましたか?

解決

OK、それはコメントに多すぎるので、答えとして投稿する危険性があります。

あなたが述べたことを望んでいると仮定して、あなたのオブジェクトがいくつかのインターフェースを実装することを理解しているので、それがスカラで言ったように、あなたは例外を得る危険性がなく、もう必要ではないことを意味します。値を取得するための反射

Suncess、あなたはそのような特徴を宣言します:

trait GenericObject {
  val id: Long
  val name: String
}
.

それからあなたはいくつかのケースクラスを宣言します:

case class A(id: Long, name: String, someOtherField: SomeType) extends GenericObject {
  //your implementation
}

case class B(id: Long, name: String) extends GenericObject

case class C(id: Long, name: String) extends B(id, name)
.

今すぐあなたのテンプレートを変更することができます:

@(elements: List[GenericObject])

@for((element, i) <- elements.view.zipWithIndex) {
  @i
  @element.id
  @element.name
}
.

とあなたはあなたのテンプレートにRuntimeExceptionsのリストを渡すべきです:

val myObjects: List[GenericObject] = List(A(1, "A name"), B(2, "B name"), C(3, "C name"))
Ok(your_template.scala.html(myObjects))
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top