1

現在、Clojure を使用してサンプル Wicket ページを作成しようとしています (既存の 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!に設定されている場所 この問題は、コンストラクターのパラメーター マッピング、不適切な逆コンパイル、またはバグですか?

4

1 に答える 1

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;

興味深いことにorg.apache.wicket.Component、サーブレット応答処理スレッドからクラス名を出力するとそのまま出力されますが、Reflector(paramType.getName() を介して) スレッドから出力すると、次の形式で出力されます[Lorg.apache.wicket.Component。私は Tomcat 5.5 を使用していますが、手がかりはありますか?

于 2009-10-28T12:05:46.147 に答える