Archiv des Intrexx Live! Forums

Hier sehen Sie die Foreneinträge aus dem Intrexx Live! Forum. Bis November 2016 war es das Forum für alle Fragen rund um die Software Intrexx von United Planet.
Seit November 2016 gibt es ein neues moderiertes Forum, das Intrexx Community Forum. Nutzen Sie bitte unbedingt dieses für aktuelle Fragen, Antworten und Informationen.

Wichtig: Dieses Forum dient als Archiv. Die Einträge beziehen sich oft auf ältere Versionen von Intrexx und entsprechen nicht mehr den aktuellen technischen Gegebenheiten.
Daher sollten alle Inhalte ausschließlich von Experten genutzt werden. Bei unsachgemäßer Anwendung kann es zu zeitaufwändigen Problemen oder Datenverlust kommen.
Übersicht > Intrexx Professional: Programming > Dublettenprüfung über WebService

Dublettenprüfung über WebService

Hallo Zusammen,

ich habe auf eine Datengruppe einen Handler processBefore definiert, der überprüft, ob ein Datensatz in der Datenbank bereits vorhanden ist (die Dublettenprüfung ist sehr komplex, da mehrere Felder in verschiedenen Varianten betroffen sind). Das klappt über die Oberfläche auch sehr gut.

Allerdings greift das Groovy-Skript nicht, wenn über den von mir bereitgestellten WebService ein Datensatz angelegt wird. Ist das ein Bug? Gibt es für WebServices Alternativen, um eine Dublettenprüfung vorzunehmen, BEVOR ein Datensatz angelegt wird? Über einen Prozess möchte ich das nicht machen, da dann der Datensatz ja bereits angelegt wurde und ich ihn dann erst wieder löschen müsste.

Intrexx 7

Viele Grüße

Markus Riehl
23.08.2016 15:32 von mriehl
Groovy-Handler werde leider nur ausgeführt, wenn über den Browser gespeichert/gelöscht wird.
Du könntest das im Prozess mit einer Groovy-Bedingung prüfen und dann im Fall der Doublette einfach eine generische Aktion vom Typ "de.uplanet.lucy.server.workflow.action.RollbackTransactionWorkflowAction" ausführen.
Dann wird das Speichern unterbrochen bzw. die Transaktion zurückgerollt und du musst nix löschen.

Edit: Alternativ kannst du auch über den App-Designer bei der Datengruppe einen UNIQUE-Key auf die Spalte machen die eindeutig sein soll, dann wird das auf Datenbankebene schon abgefangen
24.08.2016 09:29 von MartinW
Das mit dem Rollback probiere ich aus, gute Idee. Die Dublettenprüfung ist leider zu komplex, um sie auf Datenbankebene durchzuführen.
24.08.2016 15:19 von mriehl
Die gute Nachricht ist: Es funktioniert. Der Datensatz wird nicht angelegt.

Die schlechte: Die WebService-Antwort, die der Aufrufende zurückerhält, ist absolut nichtssagend:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Failed to commit current transaction.</faultstring>
<detail/>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>


Ich kann darüber keine Information übermitteln, warum das Einfügen des Datensatzes fehlgeschlagen ist.

Noch eine Idee?
29.08.2016 06:55 von mriehl
Wenn die Prüfung ohnehin in Groovy geschieht könntest du einfach mit throw new Exception("My Error Message") eine Excveption schmeißen, evtl. steht dann mehr in der Rückmeldung.
Ansonsten kenne ich mich leider zu wenig mit der Thematik aus.
29.08.2016 07:15 von MartinW
Ja, das hatte ich auch ausprobiert. Die Fehlermeldung war dann aber genauso nichtssagend:

Intrexx error on insert a data record.

Die von mir geworfene Fehlermeldung wird von Intrexx nochmal gekapselt.
29.08.2016 07:27 von mriehl
Kannst du mal das mit der Exception nochmal testen und eine eigene Meldung übergeben?
Anschließend wäre es super, wenn du hier noch die portal.log bzw. den Auszug wo die Fehlermeldung auftritt anhängen könntest.
Da kann man evtl. rauslesen ob die Meldung geschluckt wird oder evtl. nur die falsche Art Exception geworfen wird.
29.08.2016 08:27 von MartinW
Ich werfe eine RuntimeException wenn die Dublettenprüfung fehlschlägt. Die Message ist die Begründung, welche Regel verletzt wurde.

throw new RuntimeException("Fehler bei der Dublettenprüfung ...")


Im Log steht das hier:

Fehler 29.08.2016 13:11:31 - org.apache.axis2.engine.AxisEngine[HttpServerWorker-2]
Intrexx error on insert a data record.
org.apache.axis2.AxisFault: Intrexx error on insert a data record.
at de.uplanet.lucy.server.webservice.provider.service.IntrexxWebService.a(Unknown Source)
at de.uplanet.lucy.server.webservice.provider.service.IntrexxWebService.a(Unknown Source)
at de.uplanet.lucy.server.webservice.provider.service.IntrexxWebService.service(Unknown Source)
at de.uplanet.lucy.server.webservice.provider.receivers.RawXMLINOutMessageReceiver$InvokeAction.run(Unknown Source)
at de.uplanet.lucy.server.webservice.provider.receivers.RawXMLINOutMessageReceiver$InvokeAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:483)
at de.uplanet.lucy.server.webservice.provider.receivers.RawXMLINOutMessageReceiver.invokeBusinessLogic(Unknown Source)
at org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver.invokeBusinessLogic(AbstractInOutSyncMessageReceiver.java:42)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
at org.apache.axis2.transport.nhttp.ServerWorker.processPost(ServerWorker.java:212)
at org.apache.axis2.transport.nhttp.ServerWorker.run(ServerWorker.java:176)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Thread.java:745)
Caused by: de.uplanet.lucy.server.businesslogic.BlException: Error while dispatching workflow event de.uplanet.lucy.server.workflow.event.AfterCreateDataGroupWorkflowEvent(at)7b30f172(23A[...]9E6).
at de.uplanet.lucy.server.businesslogic.rtdata.jdbc.RtCloseableDataGroupTable.executeWorkflows(Unknown Source)
at de.uplanet.lucy.server.businesslogic.rtdata.jdbc.RtCloseableDataGroupTable.performUpdateAction(Unknown Source)
at de.uplanet.lucy.server.businesslogic.rtdata.jdbc.RtCloseableDataGroupTable.updateAction(Unknown Source)
... 17 more
Caused by: de.uplanet.lucy.server.workflow.WorkflowException: Fehler bei der Dublettenprüfung ...
at de.uplanet.lucy.server.workflow.WorkflowEngine.a(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowEngine.processEvent(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowEngine.dispatchEvent(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowSystemBean.dispatchEvent(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowEventDispatcher.dispatch(Unknown Source)
... 20 more
Caused by: java.lang.RuntimeException: Fehler bei der Dublettenprüfung ...
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190)
at script845[...]35.run(script845[...]35.groovy:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:901)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:884)
at de.uplanet.lucy.server.workflow.condition.GroovyScriptWorkflowCondition.process(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowEngine.a(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowEngine.access$000(Unknown Source)
at de.uplanet.lucy.server.workflow.WorkflowEngine$3.runImpl(Unknown Source)
at de.uplanet.lucy.server.portalserver.Impersonator$ProcessAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:483)
at de.uplanet.lucy.server.portalserver.LocalSystemImpersonator.run(Unknown Source)
... 25 more


Und diese SOAP-Message kommt an:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Intrexx error on insert a data record.</faultstring>
<detail/>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>

29.08.2016 11:19 von mriehl
Was ich übrigens schon versucht hatte, ist die Fehlermeldung direkt als AxisFault zu werfen. Das wurde ebenfalls gekapselt.
29.08.2016 12:10 von mriehl
Keiner mehr eine Idee?
01.09.2016 09:08 von mriehl
Es scheint so ohne weiteres tatsächlich momentan nicht möglich zu sein.

Was mir noch einfällt: Im Fehlerfall den Datensatz samt Fehlermeldung und SessionID in eine zweite Tabelle schreiben und diese auch per Webservice zu Verfügung stellen.
Dann im Fehlerfall per Webservice eben fragen, was denn das letzte Problem war und evtl. dann den Datensatz löschen.
01.09.2016 09:15 von MartinW
Zurück | Alles über Intrexx | Impressum | Datenschutzerklärung

Über United Planet
© 2019 United Planet GmbH
Schnewlinstraße 2
79098 Freiburg