Использование Beans в xPages не работает

У меня есть простое приложение с одним классом и одним xPage с одним вычисленным полем, привязанным к этому классу. Я хочу показать результат от геттера класса как bean-компонент. Не работает. Мой класс выглядит так:

package test.test;

public class Test {
    public Test() {
    }

    public String getTest() {
        return "Test";
    }
}

SSJS в вычисляемом поле:

var test = new test.test.Test();
return test.getTest();

ошибка такая:

Error while executing JavaScript computed expression
Script interpreter error, line=1, col=17: 'test' is undefined

1: var test = new test.test.Test();

Я пропустил какие-то настройки или что? Заранее спасибо, Джикра

РЕДАКТИРОВАТЬ: Если я использую управляемый компонент, проблема абсолютно идентична. Должна быть проблема с моей IDE Designer/Eclipse. Завтра попробую переустановить.

EDIT2: Сегодня я попытался сделать то же самое на компьютере моего колледжа, и это та же ошибка. Так что проблема не в моей IDE. Я должен что-то упустить. Нужно ли устанавливать какие-либо внешние библиотеки на сервер или в IDE?


person JiKra    schedule 29.11.2012    source источник
comment
Это просто для простоты. Я пробовал это три раза с разными именами пакетов и классов. Все та же ошибка.   -  person JiKra    schedule 29.11.2012
comment
Где хранится ваш класс Java? Lib/ext jar, элемент java?   -  person Simon O'Doherty    schedule 30.11.2012
comment
Это всего лишь один пакет и класс в Code/Java.   -  person JiKra    schedule 30.11.2012


Ответы (7)


Хорошо, я сделал следующее.

1) Создал новый класс Java.

введите здесь описание изображения

2) Вставьте следующий код в класс.

package test.test;

public class Test implements java.io.Serializable {

    public Test() {
        super();
    }

    public String getTest() {
        return "Test";
    }

}

3) Создал XPage со следующим источником:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:text escape="true" id="computedField1">
        <xp:this.value><![CDATA[#{javascript:var t:test.test.Test = new     test.test.Test();

return t.getTest();
}]]></xp:this.value>
    </xp:text>
</xp:view>

Открыл его в браузере и появилось слово «Тест».

Изменил переменную «t» на «test», а затем это не удалось. Таким образом, кажется, что имя переменной является проблемой.

[ИЗМЕНИТЬ]

Основываясь на вашем комментарии об использовании 8.5.2, функции кода/Java не появлялись до Notes/Domino 8.5.3. Вот почему это не работает для вас.

person Simon O'Doherty    schedule 30.11.2012
comment
Воспроизведено в ND9, так что я сделаю SPR. - person Simon O'Doherty; 30.11.2012
comment
Хорошо, но это не моя проблема. В прошлый раз, когда я пробовал var myBean = ..., тоже не получилось. - person JiKra; 30.11.2012
comment
Это было до или после того, как тест провалился? Вы работаете на сервере или клиенте? Вы пытались перезапустить клиент или HTTP, если на сервере? На этом этапе я бы порекомендовал где-нибудь опубликовать NSF для проверки или открыть PMR. - person Simon O'Doherty; 30.11.2012
comment
Я пробовал одну и ту же процедуру десять раз на трех разных серверах, двух разных клиентах Lotus Notes Designer и множестве имен классов и переменных. Все та же ошибка - xPage не может запускать код java bean. - person JiKra; 30.11.2012
comment
Какую версию Notes/Domino вы используете? Можете ли вы опубликовать образец NSF где-нибудь для тестирования? - person Simon O'Doherty; 30.11.2012
comment
Первый сервер — 8.5.2FP3 на Linux, второй сервер — 8.5.2FP4HF63 на Linux, третий сервер — 8.5.2 на Windows/7/64. Вы можете скачать один из моих примеров приложений здесь: goo.gl/nkhHf - person JiKra; 30.11.2012
comment
@JiKra: попробуй сменить пакет. кажется, проблема в неоднозначности пакета и переменной. соблюдение лучших практик Java поможет ;-) - person Frantisek Kossuth; 30.11.2012

Имя вашей переменной в SSJS (тест) конфликтует с именем пакета. Использовать

var test1=new test.test.Test();

Это будет работать...

person Serdar Basegmez    schedule 29.11.2012
comment
Извините, но это просто не работает. Пробовал разные имена, разные приложения и два сервера. В последний раз я использовал var test1 = new johny.Money(); test1.getMyMoney(); До сих пор не работает. Может быть, что-то не так с моим конструктором. Завтра попробую на другом компе. - person JiKra; 30.11.2012
comment
Я только что попробовал точный код с test1, и это сработало. Пробовали чистить и восстанавливать? - person Serdar Basegmez; 30.11.2012

Вероятно, проблема со сборкой. Убедись, что ты...

1) Собрал код, попробуй почистить и собрать.

2) Имейте правильные пути сборки - вы найдете их в диалоговом окне настроек.

3) Может найти файл Test.class, предпочтительно в представлении Navigator с точки зрения Java.

person Frantisek Kossuth    schedule 29.11.2012
comment
1. Пробовал много раз. 2. Путь Java\Build? 3. Файл класса находится в папке WebContent\WEB-INF\classes\test\test\Test.class. - person JiKra; 30.11.2012

Убедитесь, что Java и XPage собраны после того, как вы изменили имя пакета. Например, добавьте print("new XPage") к SSJS и System.out.println("new Java") к Java.

Я могу воспроизвести проблему с вашим кодом и 8.5.3FP3 Designer+Server. Когда я меняю имя пакета на test.tes, проблема исчезает.

РЕДАКТИРОВАТЬ: я все время использовал имя переменной «t» и могу подтвердить, что проблема возникает также, если я изменю имя переменной на «test», как Саймон узнал ниже. Возможно, у Саймона другая версия Desiger/Domino, потому что test.test.Test у меня не работает с именем переменной "t".

EDIT2: Похоже, вы используете 8.5.3 Designer с сервером 8.5.2. Как сказал Саймон, Code/Java был представлен в версии 8.5.3. Инструкции по написанию Java для версии 8.5.2 можно найти, например, здесь: http://xpageswiki.com/web/youatnotes/wiki-xpages.nsf/dx/Work_with_Java

person Panu Haaramo    schedule 30.11.2012

При инициализации класса Java в SSJS код должен быть таким:

var testObj:test.test.Test = new test.test.Test();
person Naveen    schedule 29.11.2012
comment
Просто к сведению, но этот var testObj:test.test.Test предназначен только для редактора SSJS, чтобы предоставить тип заранее, даже если это не для пользовательских классов. - person keithstric; 30.11.2012

Вы забыли поставить новое заявление.

var test = new test.test.Test();
person Simon O'Doherty    schedule 29.11.2012
comment
Нет, я этого не делал. Я просто забыл положить его сюда. Моя ошибка. Даже с новым утверждением это не работает. Та же ошибка... - person JiKra; 29.11.2012
comment
Готово :-) И еще. См. Редактировать2. - person JiKra; 30.11.2012

Не уверен, что это проблема, но я думаю, что вам нужно определить переменную "test" типа String в Bean, чтобы получить ее значение с помощью getTest().

person Michael Ruhnau    schedule 30.11.2012
comment
Нет, он не привязывается (и даже с привязкой это не будет проблемой), он просто вызывает getTest() для нового экземпляра. - person Frantisek Kossuth; 30.11.2012