novomind
I'm new here

Zugriff auf BaseContext aus dem Ausgabekanal

Jump to solution

Hallo,

wir wollen mittels "class" aus dem Ausgabekanal heraus die Methode einer Java-Klasse aufrufen. Die Methode benötigt den BaseContext, um auf die Masterlanguage und die Projekteinstellungen zugreifen zu können. Zu diesem Zweck haben wir den Kontext mittels #global.context übergeben. Die Signatur der aufgerufenen Methode sieht etwa so aus:

public static String someMethod(BaseContext context, PageRef pageRef)

Der entspreche Aufruf im Ausgabekanal sieht in etwa so aus:

$CMS_TRIM(level:4)$

    $CMS_VALUE(class("some.package.SomeClass").someMethod(#global.context, ref))$

$CMS_END_TRIM$

Bei Generieren der Seiten wird beim Aufruf der Methode eine Fehlermeldung ausgegeben, die allerdings wenig aussagekräftig ist (es wird nur der Name der Klasse ausgegeben). Wir vermuten, dass es am Typ des durch #global.context zurückgegebenen Objekts liegt, der nicht BaseContext ist, sondern etwas anderes.

Wir können zwar über die pageRef an UserService kommen und so an die Projekteinstellungen und die Masterlanguage, aber dies ist nicht der empfohlene Weg und auch etwas "eklig". Unsere Frage: Gibt es einen Weg, vom Ausgabekanal aus ein BaseContext-Objekt an eine Java-Klasse zu übergeben oder einen eleganteren (empfohlenen) Weg, um von der Java-Klasse aus direkt auf die Projekteinstellungen bzw. die Masterlanguage zuzugreifen?

Viele Grüße

0 Kudos
1 Solution

Accepted Solutions
Peter_Jodeleit
Crownpeak employee

wir wollen mittels "class" aus dem Ausgabekanal heraus die Methode einer Java-Klasse aufrufen. Die Methode benötigt den BaseContext, um auf die Masterlanguage und die Projekteinstellungen zugreifen zu können. Zu diesem Zweck haben wir den Kontext mittels #global.context übergeben

#global.context ist der aktuelle Variablenkontext der Generierung, das ist nicht vom Typ BaseContext.

#global wäre in eurem Fall der korrekte Übergabewert für den Parameter.

[EDIT]

Kann es sein das die "Fehlermeldung" aus eurem Code kommt?

Peter

View solution in original post

0 Kudos
7 Replies
StefanSchulz
I'm new here

Hi,

Ronny Rößler schrieb:

der nicht BaseContext ist, sondern etwas anderes.

was ist denn dieses "etwas anderes"?

Gruß

Stefan

0 Kudos

Hallo,

das wissen wir leider nicht, da die Fehlermeldung, wie gesagt, keine weiteren Informationen liefert. Mittlerweile haben wir aber herausgefunden, dass es offensichtlich nicht an der #global.context Variable liegt. Als wir den oben beschriebenen (nicht empfohlenen) Weg ausprobiert haben, gab es dieselben Fehlermeldungen. Deswegen hier noch zwei weitere Infos:

  1. Die aufgerufene Methode ist in der Java-Klasse überladen. es gibt sie einmal mit PageRef und einmal mit TargetReference als Parameter. Letztere ruft erstere mit dem Parameter targetRef.getPageRef() auf. Ist das problematisch?
  2. Auf jede der o. g. Fehlermeldungen folgt eine "Replacing null value with empty default!"-Warnung.

Viele Grüße

0 Kudos

Hi,

meine Rückfrage war wohl nicht klar formuliert. Ich hätte gerne den Klassennamen gewusst, eine komplette Angabe der Fehlermeldung wäre natürlich noch besser.

zu 1.) Ich kann hier kein Problem erkennen. PageRef und TargetReference stehen in keinerlei Vererbungsbeziehung.

zu 2.) Diese Meldung sagt aus, das ein im Ausdruck referenziertes Objekt (bzw. der Rückgabewert eines Methodenaufruf's) null lieferte.

Gruß

Stefan

0 Kudos

Die Fehlermeldung sieht in etwa so aus:

ERROR 23.09.2013 18:40:36.444{g-sec=110056,g-node=110051} (de.espirit.firstspirit.generate.SiteProduction): some.package.SomeClass
WARN  23.09.2013 18:40:36.444{g-sec=110056,g-node=110051} (de.espirit.firstspirit.generate.SiteProduction): Replacing null value with empty default!

Viele Grüße

0 Kudos
Peter_Jodeleit
Crownpeak employee

wir wollen mittels "class" aus dem Ausgabekanal heraus die Methode einer Java-Klasse aufrufen. Die Methode benötigt den BaseContext, um auf die Masterlanguage und die Projekteinstellungen zugreifen zu können. Zu diesem Zweck haben wir den Kontext mittels #global.context übergeben

#global.context ist der aktuelle Variablenkontext der Generierung, das ist nicht vom Typ BaseContext.

#global wäre in eurem Fall der korrekte Übergabewert für den Parameter.

[EDIT]

Kann es sein das die "Fehlermeldung" aus eurem Code kommt?

Peter
0 Kudos

Hallo,

das Thema hat sich erledigt, wir hatten währned der Entwicklung auf einen anderen Branch gewechslet und die kompilierten Module des alten Branches installiert. Die Fehlermeldung besagte also wohl, dass die Klasse nicht vorhanden ist. Wir würden uns da trotzdem eine aussagekräftigere Fehlermeldung wünschen, so dass der Fehler leichter zu erkennen ist.

Der Tipp, #global statt #global.context zu nehmen war trotzdem sehr hilfreich, da wir hier vermutlich auf Schwireigkeiten gestoßen wären. Vielen Dank!

Viele Grüße

0 Kudos

Die Fehlermeldung besagte also wohl, dass die Klasse nicht vorhanden ist. Wir würden uns da trotzdem eine aussagekräftigere Fehlermeldung wünschen, so dass der Fehler leichter zu erkennen ist.

Hier wäre ein Einschalten des erweiterten Loggins hilfreich gewesen:

   $CMS_SET(#global.debugMode, true)$

Damit wäre die "java.lang.ClassNotFoundException" angezeigt worden.

Peter