2016-06-10 6 views
1

Из всех странностей в нашем текущем проекте XPages это один в настоящее время попадает в потолок:XPages выполнения интерпретации Java имя пакета в качестве строкового объекта

мы создали несколько Java Beans в нашем текущем проекте. Внутри Domino Designer все они хранятся ниже Код >> Java, так что ясно, что они являются автоматически частью пути к проекту. Все наши бобы относятся к структуре пакета de.edcom.* (это то, что мы использовали навсегда без каких-либо проблем). Объекты в основном вызваны из SSJS, используя полные имена пакетом (не зарегистрированы в качестве управляемых компонентов по разным причинам), как в

var o = de.edcom.myObject.someMethod(); 

Ни в одном из моих предыдущих проектов XPages это вызвало никаких проблем, он просто работал. В текущем проекте, однако во время выполнения XSP вдруг начали интерпретировать имя пакета в качестве строкового объекта дает нам эту ошибку во время выполнения:

Unknown member 'edcom' in Java class 'java.lang.String' 

ssjs строка кода в вопросе, глядя, как это:

return de.edcom.TOC.buildTOC(); 

Мы абсолютно не знаем, что может быть причиной этого, почему только в этом проекте и почему он иногда работает, но в основном это не так.

Там одна разницы между этими проектами и другими раньше, и это locallization: пользователи могут переключаться между «английским» и «немецким» локал, и, конечно, мы используем коды как

context.setLocaleString("de") 

и, конечно, мы имеем несколько фрагментов коды JavaScript ищем локальные настройки, как в

if(context.getLocalString()==="de"){... 

Сегодня утром мы на самом деле переименовали/переработана все Java Beans для разных имен пакетов (com.edcom. *), и с тех пор ошибка hasn Появился (пальцы скрещены!).

Но опять же я думаю, что это слишком глупо, на самом деле не может быть связи, или это может быть?

EDIT:

Я попытался с помощью importPackage(), в сочетании с xe:objectData (источник данных в соответствии с рекомендациями Адриана и Павла в своих ответах), но я все еще получаю, что «unknown member 'edcom' in Java class 'java.lang,String'» сообщение, в настоящее время только на другое положение в коде на моей линии, говорящее importPackage(de.edcom).

Я вернусь к пакету «com.edcom» и буду искать лучшее решение; к сожалению, поиск строки «de» внутри всего кода дает около 12 000 совпадений; Теперь способ найти истинную причину этого в том, что стог

EDIT # 2:

выглядит как мы наконец нашли страшную «де» переменная: она была хорошо спрятана в вычисленной customControl собственности; Я не знаю, почему все поисковые запросы, которые я выполнял за последние несколько дней, не смогли найти.

В любом случае, очень хорошо знать, что мы должны быть еще более осторожными при указании наших переменных ssjs; Я никогда бы не подумал, что имя переменной ssjs может когда-либо помешать части TLD в пакетах Java; мы, вероятно, сделать его внутреннюю политику, наши переменные должны должны быть названы «vDe», «vCom», «vIt» и т.д., а не только коротких строчных букв ...

+1

Не забудьте объяснить значение такой внутренней политики. В противном случае вы можете столкнуться с проблемами с переменными «vA» и пакетами из Ватикана :-) –

ответ

3

Возможно, вы использовали переменную de (которая является строкой) в другом скрипте SSJS, который выполняется до того, как перед этим стоит проблема.

Я видел аналогичные проблемы, что переменная, которая явно не объявлена ​​в блоке сценария, может наследовать значения из другого блока сценария.

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 
    <xp:this.beforeRenderResponse><![CDATA[#{javascript: 
     var ex1 = "Hello World"; 
     var ex2 = "Bye bye"}]]> 
    </xp:this.beforeRenderResponse> 
    <xp:this.afterRenderResponse><![CDATA[#{javascript: 
     print("value ex1: " + ex1); 
     print("value ex2: " + ex2);}]]> 
    </xp:this.afterRenderResponse> 
</xp:view> 

приводит:

[1CA8:000C-4354] 10.06.2016 14:33:01 HTTP JVM: value ex1: Hello World 
[1CA8:000C-4354] 10.06.2016 14:33:01 HTTP JVM: value ex2: Bye bye 

Таким образом, вы должны использовать функцию importPackage() импортировать ссылки на ваши классы ява или гораздо лучше, использование управляемых бобов или dataContexts.

+0

жаль, что мне пришлось отозвать мое раннее согласие с вашим ответом; даже с использованием importPackage() и в сочетании с намеком Павла относительно xe.objectData, я все еще получаю ту же ошибку; см. мое издание выше –

+1

, вы искали любую переменную с именем «de»? –

+0

да, и я тоже нашел его (см. Мое второе редактирование) –

1

SSJS требует переменные, которые будут внедрены в область. Все, что с точкой в ​​нем, сначала перейдет к этим переменным. Похоже, что локализация хранит переводы в переменной с именем «de», что объясняет вашу проблему.

Возможно, importPackage(de.edcom), а затем с помощью return TOC.buildTOC(); устранить эту проблему. Я бы рассмотрел эту лучшую практику, но в любом случае в SSJS вы рискуете столкновениями имен переменных.

Лично я предпочитаю, чтобы поддержать все XPage с классом контроллера Java (я использую рамки frostillicus Джесси Галлахера, и поэтому он всегда доступен с переменной pageController), так что мой SSJS просто вызывает pageController.myMethod(), который затем позволяет избежать всех коллизий имен и позволяет импортировать Java, чтобы я отображал правильный класс Java. Есть более простые способы сделать это, например. с xe: dataObject в верхней части каждого XPage.

+0

Идеальная помощь, как всегда, относится к другому ответу @Adrian; так как я могу только принять один ответ, я решил подтолкнуть некоторые моменты к Адриану; надеюсь, что вы не возражаете;) - в вашем ответе есть опечатка, кстати, это должно быть «xe: dataObject». Но я нашел его в любом случае (с помощью одной из ваших записей в блоге) –

+0

hmm - было немного раньше, чтобы принять ответ - все еще не работает, см. Издание выше –

+1

Ключ будет узнать, что такое объект. Поскольку он существует, когда ваш код запущен, попробовав 'print (de)' (или какой-либо другой синтаксис ведения журнала), чтобы узнать, что это такое? –