mseyfarth
Elite Observer

Selbst definierte Java Objekte im CMS verwenden?

Jump to solution

Hallo zusammen,

ich habe zwar schon mal in der Community gesucht, bin aber zu keinem Ergebnis gekommen, daher die Frage hier.

Ist es möglich dem CMS selbst definierte Objekte beizubringen?

Beispiel:

Ich man definiere in Java eine neue Klasse

public class Mensch {

private int alter;

private long hoehe;

private String vorname;

private String nachname;

// Getter & Setter

// toString

// whatever

}

}

Über ein Modul wird ein Objekt erzeugt und mit Werten befüllt, welches im Anschluss an das CMS übermittelt wird.

Kann ich im CMS irgendwie auf das Objekt mit den Werten zugreifen alà

mein_cms_objekt.getAlter();

$CMS_VALUE(mein_cms_objekt.getAlter())$

??

Kann man das definierte Model als Dependency (oder direkt über das Modul) anziehen, sodass das CMS weiß, ok dieses Objekt ist vom Objekttyp "Mensch" und hat alle diese Attribute (auch interessant für Debugger).

Wenn das schon irgendwie geht. lasst mich das bitte wissen, weil wir uns immer extrem abmühen alles in eine Map<String,String> zu kapseln, das wir später auf die Werte zugreifen können.

Verwendete FS Version 2018-8

Danke und Gruß

Matthias

0 Kudos
1 Solution

Accepted Solutions

Hi Matthias,

du kannst im Template auf die Eigenschaften des Java-Objekts "ganz normal" zugreifen. Also in deinem Beispiel kannst du sowohl $CMS_VALUE(mensch.getAlter())$ als auch verkürzt $CMS_VALUE(mensch.alter)$ benutzen. Voraussetzung ist natürlich das die Klasse Mensch eine öffentliche Methode "getAlter()" hat.

LG, Peter

Peter

View solution in original post

0 Kudos
7 Replies
mbergmann
Crownpeak employee

Hallo Matthias,

suchst Du sowas hier?

Rückgabe einer Datenstruktur von einem Executable in ein Template

Viele Grüße

Michael

0 Kudos

Hallo Michael,

jain.

Was ich vermeiden möchte, ist in einem Executable oder in einem einfachen Modul, welches irgendeinen Service aufruft,

dass wir im Modul ein manuelles Mapping der Daten durchführen müssen, Bsp.

  1. ... 
  2. Map<String, Object> result = (Map<String,Object>) params.get("result"); 
  3. ... 
  4. result.put("someKey", someResultObject); 
  5. result.put("anotherKey", anotherResultObject); 
  6. ...
  7. return result;

Sondern, das wir aus dem Beispiel oben, das ganze Objekt "Mensch" zurückgeben und verwenden können.

Wenn man ein neues Modul entwickelt, wird jeder halbwegs gescheite Java Entwickler Klassen (Models) definieren, mit dem er Objekte erzeugt und mit diesen dann arbeitet.

Meine Frage nun nochmal spezifiziert: Wenn das Modul im Firstspirit Server installiert wird, kann ich dann diese Objekte vom Typ "Mensch", "Human", "Car", was_auch_immer_für_ein_java_Objekt_ich_definiere im CMS verwenden?

Bsp:

Im Template:

$CMS_SET(set_mensch,"Modulname.Mensch.class")$  // definiere Typ der Variable als Mensch aus dem Modul

$CMS_RENDER(script:"some_script_name", result:set_mensch)$ 

$-- und dann z.B. sowas: --$ 

$CMS_VALUE(result.someMethod())$ // result ist jetzt vom Typ "Mensch", welches aus dem Modul zurückgegeben wird

Im Modul:

Mensch mensch = new Mensch();

... 

mensch.setAbc(abc);

mensch.setDef(def);

...

return mensch;

Java ist eine OOP. Derzeit empfinde ich aber, dass das CMS dieses Konzept missachtet.

Ausgenommen alle Objekte, die Java nativ mitbringt.

Hinweis:

Ein Executable ist evtl. ein schlechtes Beispiel, da hier die Signatur fest definiert wird auf Map<String, Object>.

Aber ein eigenes Modul kann ja zurück geben, was wir definieren.

Hoffe das ist etwas verständlicher

Gruß

Matthias

0 Kudos

Hi Matthias,

du kannst im Template auf die Eigenschaften des Java-Objekts "ganz normal" zugreifen. Also in deinem Beispiel kannst du sowohl $CMS_VALUE(mensch.getAlter())$ als auch verkürzt $CMS_VALUE(mensch.alter)$ benutzen. Voraussetzung ist natürlich das die Klasse Mensch eine öffentliche Methode "getAlter()" hat.

LG, Peter

Peter
0 Kudos

Hallo Matthias,

wichtig zu wissen ist hier noch: Der "Umweg" über das Executable ist hier nur nötig, damit man die Klassen im Modul-Scope lassen kann. Das Executable (aufgerufen per Renderscript) dient hier nur als Zwischenstation, weil Executables eine "Sonderrolle" haben und - solange sie als PUBLIC-Komponente in der Module.xml deklariert sind - über den #executable-class-Mechanismus auch aufgerufen werden können, wenn ihre Ressourcen im Modul-Scope liegen. Du muss dann dem Executable aus dem Template heraus nur eine leere Map (oder Liste) mitgeben. In diese Liste legt dann das Executable ein beliebiges Objekt hinein und im Template holst Du es Dir wieder heraus.

Ich hoffe das macht es etwas klarer 😉

Viele Grüße

Michael

0 Kudos

Hallo Peter,

Und das funktioniert, sobald ich das CMS-Modul, welches diese Klassen beinhaltet installiert habe?

Rafft das dann eigentlich auch der Debugger, dass das zurückgegebene Objekt von diesem Typ ist (inkl Autocomplete / Vorschläge)?

Gruß

Matthias

0 Kudos

Ja, das funktioniert auch im Debugger - da ist ja dann die konkrete Klasse bekannt. Daher ist es an der Stelle egal, das das Executable "untypisiert" ist.

Peter
0 Kudos

Vielen Dank Euch beiden!

Mein Kollege und ich werden das in den nächsten Tagen mal testen.

Jedoch werde ich den Thread als beantwortet kennzeichnen

Gruß

Matthias

0 Kudos