2009-10-28 4 views
1

현재 Clojure (기존 wicket 프로젝트에서)와 함께 Wicket 샘플 페이지를 만들려고합니다. 코드는 다음과 같습니다Clojure : Wicket 패널을 확장하고 패널 메서드를 호출하십시오.

페이지가 내가 런타임 오류가 다음 얻을 생성되는
(ns a.set.of.packages.dataview.info.EmptyNodeInfo2Panel 
    (:import [a.set.of.packages.tree TreeModelBean] 
      [a.set.of.packages.dataview.supplemental GenericHeaderPanel])) 

(gen-class 
    :name a.set.of.packages.dataview.info.EmptyNodeInfo2Panel 
    :extends org.apache.wicket.markup.html.panel.Panel 
    :state state 
    :init init 
    :constructors {[String a.set.of.packages.tree.TreeModelBean] [String]} 
    :post-init construct) 

(defn -init [id model-bean] 
    [[id] nil]) 

(defn -construct [this id model-bean] 
    (.add this (GenericHeaderPanel. "header" model-bean))) 

는 :

java.lang.IllegalArgumentException: No matching method found: add for class a.set.of.packages.dataview.info.EmptyNodeInfo2Panel 

즉 나는 슈퍼 클래스의 메소드에 호출 할 수 없습니다.

디 컴파일 construct 방법은 다음과 같습니다

public Object invoke(Object this, Object id, Object model_bean) 
    throws Exception 
{ 
    this = null; 
    id = null; 
    model_bean = null; 
    return Reflector.invokeInstanceMethod(this, "add", new Object[] { 
     new GenericHeaderPanel((String)"header", (TreeModelBean)model_bean) 
    }); 
} 

이 모든 것이 null로 설정되는 경우! 이 문제는 생성자 매개 변수 매핑, 잘못된 디 컴파일 또는 버그와 관련이 있습니까?

답변

1

저는 Clojure 내부를 파헤 치고 문제의 근본 원인을 발견했습니다. 표시된 행이 작동하지 않습니다.

// clojure.lang.Reflector 
static public boolean paramArgTypeMatch(Class paramType, Class argType) 
{ 
    ... 
    if(paramType == argType || paramType.isAssignableFrom(argType)) // <<< 
    return true; 
    ... 

아마 클래스 로더 문제 (내가 Class.forName을 가진 동적 EmptyNodeInfo2Panel 클래스를 생성)이있다. 일치 된

클래스는 다음과 같습니다

a.set.of.packages.dataview.supplemental.GenericHeaderPanel 
org.apache.wicket.Component; 

흥미로운 점 : 나는 서블릿 respnose 처리에서 org.apache.wicket.Component 클래스 이름을 인쇄 할 때 paramType.getName을 통해 내가 (Reflector THEAD에서 인쇄 할 때 같이가 인쇄 스레드 만 ()), 다음 양식으로 인쇄합니다 : [Lorg.apache.wicket.Component. Tomcat 5.5를 사용합니다. 단서가 있습니까?

+0

"다음 형식으로 인쇄됩니다 :'[Lorg.apache.wicket.Component'] 여는 대괄호는 다음에 오는 클래스의 배열을 나타냅니다. – pmf

+0

네, 방금 생각해 봤고 다음과 같은 방법으로 작동합니다 : (defn -construct [this id model-bean] (this를 (배열의 [GenericHeaderPanel. "header-model-bean])))) Panel 클래스의'add' 메소드에서 Wicket 워드 프로세서를 읽고 있습니다. 가변 인수를 취합니다 ... 나는 미친 날이 었어요. :) – Andrew