hermann_schoell
I'm new here

Webservice soll Daten aus Datenquellen in FirstSpirit auslesen

Jump to solution

Guten Abend zusammen,

ich habe einen Webservice, der bestimmte Seiten updaten soll.

Dazu soll aus der Seite das Index-Element "stPublicationTypes" ausgelesen und für jeden einzelnen Index, ein Wert aus der Datenquellen Spalte namens "stPublicationstypId"

So sieht mein Code aus, der mit noch Probleme bereitet:

FormField<?> dataValue = section.getFormData().get(masterLanguage, "stPublicationTypes");

if (dataValue != null) {

LOGGER.debug("found template " + sectionTemplateReferenceName + ", stPublicationTypes = " + dataValue);

   

  

Index index = (Index) dataValue.get();

DataAccessSession dataAccessSession = index.createSession(SpecialistsBroker);

for (Index.Record record : index) {

String myIdentifier = record.getIdentifier();

Dataset ds = (Dataset) dataAccessSession.getData(myIdentifier);

FormData formData2 = ds.getFormData();

Integer publikationsTypId = (Integer) formData2.get(null, "stPublicationstypId").get();

          if (publicationTypeIdList.contains(publikationsTypId)) {

    foundPubIdInPage = true;

  }

}

Das FormField ist vom Typ de.espirit.firstspirit.store.access.DataWrappingFormData$EditorValueWrappingFormField

dataValue.get() gibt mir IndexImpl$BoundRecord.

Soweit funktioniert noch alles.

Ich versuche jetzt über eine DataAcessSession auf die Datenquelle zuzugreifen. Aber hier scheiter ich am SpecialistsBroker. z.10

Woher bekomme ich den? Ist das überhaupt die richtige Vorgehensweise?

Ich habe viele Beispiele gesehen, wo einfach ein context übergeben wird, allerdings rufe ich diesen Webservice nicht von FirstSpirit aus auf, deswegen kann ich keinen Context übergeben.

Kann ich mir einen Context selbst erzeugen? Bis jetzt habe ich in der Dokumentation immer nur Interfaces als Context gesehen, also nichts, was ich initialisieren könnte...

In einem anderen Beispiel aus dem Forum habe ich gesehen, dass sich jemand über die Connection zu FirstSpirit einen SpecialistBroker geholt hat:

SpecialistsBroker spbroker = getConnection().getBroker();

Allerdings erhalte ich dann folgende Exception:

java.lang.IllegalStateException: No specialist found for 'de.espirit.firstspirit.agency.PluginsAgent$1@991513cd'! [source: de.espirit.firstspirit.agency.ConnectionDelegatingSpecialistsBroker@1b70203f]

at de.espirit.firstspirit.agency.AbstractSpecialistsBroker.requireSpecialist(AbstractSpecialistsBroker.java:14)

at de.espirit.firstspirit.access.BaseContextImpl.requireSpecialist(BaseContextImpl.java:99)

at de.espirit.firstspirit.client.plugin.dataaccess.DataAccessSessions.getDataAccess(DataAccessSessions.java:97)

at de.espirit.firstspirit.client.plugin.dataaccess.DataAccessSessions.createSession(DataAccessSessions.java:49)

at de.espirit.firstspirit.access.store.templatestore.gom.lists.GomIndexSourceImpl.createSession(GomIndexSourceImpl.java:133)

at de.espirit.firstspirit.client.access.editor.lists.IndexImpl.createSession(IndexImpl.java:190)

at de.blb.researchportal.firstspirit.StartUpdateGeneration.analyzePage(StartUpdateGeneration.java:221)

Ich verstehe, die Exception so, dass ich einen falschen Typ von SpecialistBroker benutze. Ich brauche einen PluginsAgent? Wobei ich sowas in den Docs nicht gefunden habe.

Wie erzeuge ich mir denn den richtigen SpecialistBroker für diese Aufgabe?

Ich hoffe mir kann jemand weiterhelfen.

Vielen Dank

Hermann

0 Kudos
1 Solution

Accepted Solutions

Hallo Hermann,

der Fehler kommt dadurch zustande, dass der Broker an der Stelle nicht Projektspezifisch ist.

Folgendes sollte helfen:

Connection connection = ...;

SpecialistsBroker serverBroker = connection.getBroker();

BrokerAgent projectBroker = serverBroker.requireSpecialist(BrokerAgent.TYPE).getBrokerByProjectId(%projectID%);

Gruß,

Christopher

View solution in original post

0 Kudos
4 Replies
ChKo
Elite Observer

Hallo Hermann,

zu der Frage "Woher bekomme ich den? Ist das überhaupt die richtige Vorgehensweise?" würde ich spontan mit "Nein" antworten.

Firstspirit ist als Statisches- bzw. Generierendes-CMS ohne Ausgabeschicht konzipiert.

Bedeutet: FS stellt die Daten externen Systemen bereit, welche dann für die Auslieferung zuständig sind. Dies hat dann auch den Vorteil, dass bei einer Downtime des CMS die LIVE-Seite keine negativen Auswirkungen mitbekommt (bei dem von dir angestrebten Konstrukt würde der Service in diesem Fall einen Fehler melden müssen). Auch ist in Bezug auf größere Lasten ist dies kein belastbares Konstrukt.

Der "FirstSpirit-Way-of-life" wäre es also, entweder die Daten (z.B. in Form einer XML) zu deployen und eine WebApp zu schreiben welche diese Daten ausließt und auswertet. Alternativ könnte man das ganze "Headless" konzipieren und die Daten in eine Datensenke wie den FirstSpirit CaaS, eine MongoDB oder ElasticSearch indexieren. Je nach dem was ihr schon habt/zukünftig anstrebt.

Das ist wahrscheinlich nicht ganz die Antwort die du erwartet hast, hilft aber hoffentlich trotzdem weiter Smiley Wink

Gruß,

Christopher

0 Kudos

Hallo Christopher,

danke für deine Antwort. Bei meiner Frage hatte ich eher gehofft es kommt sowas wie: "Es gibt eine ganz einfache Art und Weise und zwar..."

Wenn ich noch in der Entwicklung wäre, würde ich jetzt einen anderen Weg einschlagen und den Webservice anders aufbauen.

Vermutlich hast du Recht und dieser Weg ist von FirstSpirit nicht angedacht, deswegen fällt es mir wahrscheinlich auch so schwer voranzukommen. ^^

Allerdings muss ich das als Bugfix beheben.

Das was nicht funktioniert ist noch eine Altlast von der Migration FS_LIST auf FS_INDEX.

Mit FS_LIST hatte das die Jahre wunderbar geklappt.

Deswegen hoffe ich, dass vielleicht noch eine andere Idee kommt, nehme aber deinen Vorschlag als Idee mit, falls wir keinen anderen Weg finden.

Viele Grüße

Hermann

0 Kudos

Hallo Hermann,

der Fehler kommt dadurch zustande, dass der Broker an der Stelle nicht Projektspezifisch ist.

Folgendes sollte helfen:

Connection connection = ...;

SpecialistsBroker serverBroker = connection.getBroker();

BrokerAgent projectBroker = serverBroker.requireSpecialist(BrokerAgent.TYPE).getBrokerByProjectId(%projectID%);

Gruß,

Christopher

0 Kudos

Funktioniert wunderbar. Danke für die Antworten 😃

Grüße

Hermann

0 Kudos