문제

Java 애플리케이션에서 Play Framework 2.1.5를 사용하고 있습니다.

일반 개체 목록을 매개변수로 사용하는 뷰 구성 요소가 있습니다.이 구성 요소에서는 목록을 반복하고 각 요소의 일부 속성을 가져오고 싶습니다.

이는 다음과 같이 보일 것입니다:

@(elements: List[_])

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

(이 3가지 값이 필요합니다)

하지만 물론, element.id 그리고 element.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. 어쩌면 Scala가 이런 종류의 구문을 제공할 수도 있습니다.

아니면 내가 잘못된 방향을 보고 있는 것일 수도 있습니다.

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

좋아, 댓글을 달기에는 너무 많은 내용이므로 답변으로 게시하겠습니다.

당신이 결코 얻지 못한다고 가정하면 RuntimeException 당신은 당신의 객체가 어떤 인터페이스를 구현하는 것이 타당하다고 언급했으므로(또는 Scala에서 말한 것처럼 특성을 혼합하여) 예외가 발생할 위험이 없으며 값을 얻기 위해 더 이상 리플렉션이 필요하지 않습니다.

다음과 같은 특성을 선언한다고 가정해 보겠습니다.

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
}

그리고 다음 목록을 통과해야 합니다. GenericObject귀하의 템플릿에:

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