Clojure: расширить панель Wicket и вызвать методы панели - PullRequest
1 голос
/ 28 октября 2009

В настоящее время я пытаюсь создать пример страницы Wicket с Clojure (в существующем проекте калитки). Код выглядит так:

(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 Ответ

1 голос
/ 28 октября 2009

Я покопался во внутренностях Clojure и нашел корень проблемы. Отмеченный ряд не работает.

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

Вероятно, есть проблема с загрузчиком классов (я создаю класс EmptyNodeInfo2Panel динамически с Class.forName).

Соответствующие классы:

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

Интересная вещь: когда я печатаю org.apache.wicket.Component имя класса из потока обработки сервлета, он печатает как есть, но когда я печатаю его из Reflector thead (через paramType.getName ()), он печатает в следующем виде: 1011 *. Я использую Tomcat 5.5, есть ли какие-нибудь подсказки?

...