Home Forum Nuclos Entwicklung Makros und Regeln CollectableComparison.error – aber warum?

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)
  • Autor
    Beiträge
  • #6564
    Thorsten Kreutz
    Teilnehmer

    Hallo zusammen,

    ich verzweifle gerade an folgendem Phänomen:

    ich habe eine Entität „Kurse“ mit zwei Subforms „Theorie“ und „Praxis“, die jeweils Termine enthalten. Beim Speichern wird eine Regel ausgeführt, die die jeweiligen Termine in Reihenfolge durchnummeriert (brauche ich für die weitere Verarbeitung).

    Das klappt auch, wenn ich neue Datensätze anlege oder Datensätze entferne. Wenn ich jedoch Datensätze klone, kriege ich in der GUI einen Fehler „Der Datensatz konnte nicht gespeichert werden“ und den „CollectableComparison.error“ im Server-Log.

    Lege ich einen identischen Datensatz von Hand an, funktioniert auch die Regel, also kann es am Inhalt der (sichtbaren) Daten nicht liegen.

    Der Fehler lässt sich wie folgt eingrenzen:
    Manuell angelegte Datensätze -> speichern & Regelausführung ok.
    Geklonter Datensatz -> Fehlermeldung
    Deaktivierte Regel -> speichern & Regelausführung ok.
    Aktivierte Regel ohne Code (nur Methodenaufruf) -> Fehlermeldung

    Es hängt also irgendwie mit der Regel zusammen, allerdings spielt der Quellcode keine Rolle?!

    Anbei die ersten Zeilen des Fehlerlogs:


    2013-04-05 01:31:02,836 INFO [org.nuclos.server.common.ejb3.NuclosFacadeBean] - BEGIN executing business rules for event "Save" and entity Classes...
    2013-04-05 01:31:02,836 INFO [org.nuclos.server.common.ejb3.NuclosFacadeBean] - FINISHED executing business rules for event "Save" and entity Classes...
    2013-04-05 01:31:03,075 WARN [org.springframework.remoting.support.RemoteInvocationTraceInterceptor] - Processing of HttpInvokerServiceExporter remote call resulted in fatal exception: org.nuclos.server.genericobject.ejb3.GenericObjectFacadeRemote.modify
    java.lang.IllegalArgumentException: CollectableComparison.error
    at org.nuclos.common.collect.collectable.searchcondition.CollectableComparison.(CollectableComparison.java:82)
    at org.nuclos.common.SearchConditionUtils.newEOComparison(SearchConditionUtils.java:116)

    Am Ende der Ratlosigkeit wartet die Hoffnung auf das Forum (oder so ähnlich) – kennt jemand die Lösung?

    Vielen Dank und Gruß,
    jproxx

    #6565
    Frank Pavlic
    Teilnehmer

    Hallo,
    laut Quellcode ist dein Komparand leer, also Wert des Feldes. Insofern wäre es hilfreich, wenn Du den Quellcode deiner Regel postest. Auch wäre eine vollständigere Log hilfreich.

    Gruß
    Frank

    #6566
    Thorsten Kreutz
    Teilnehmer

    Dem kann ich gerne nachkommen – wobei ich den Fehler wie erwähnt auch erhalte, wenn ich den Quellcode komplett entferne…


    public class SetClassItemNumbers implements UpdateRule {

    public void update(UpdateContext context) throws BusinessException {
    Classes classname = context.getBusinessObject(Classes.class);
    List lessonList = classname.getLessons();
    if (lessonList.size() > 0) {
    Date[] lessonDates = new Date[lessonList.size()];
    for (int i=0;i<lessonList.size();i++) {
    Lessons lesson = lessonList.get(i);
    lessonDates[i] = lesson.getDatefrom();
    }
    Arrays.sort(lessonDates);
    for (int i=0;i<lessonList.size();i++) {
    Lessons lesson = lessonList.get(i);
    for (int j=0;j<lessonDates.length;j++) {
    if (lessonDates[j] == lesson.getDatefrom()) {
    lesson.setNumber(j+1);
    break;
    }
    }
    }
    }
    List exerciseList = classname.getExercises();
    if (exerciseList.size() > 0) {
    Date[] exerciseDates = new Date[exerciseList.size()];
    for (int i=0;i<exerciseList.size();i++) {
    Exercises exercise = exerciseList.get(i);
    exerciseDates[i] = exercise.getDatefrom();
    }
    Arrays.sort(exerciseDates);
    for (int i=0;i<exerciseList.size();i++) {
    Exercises exercise = exerciseList.get(i);
    for (int j=0;j<exerciseDates.length;j++) {
    if (exerciseDates[j] == exercise.getDatefrom()) {
    exercise.setNumber(j+1);
    break;
    }
    }
    }
    }
    }
    }

    Und wie gewünscht auch der vollständige Log – direkt nach Login und auf kürzestem Wege zur Fehlermeldung:

    1. Öffenen des Layout, durchführen einer Suche ohne Parameter:

    2013-04-05 09:34:45,884 ERROR [org.nuclos.common.CollectableEntityFieldWithEntity] - CollectableEntityFieldWithEntity can only be serialized on the *client* side: Name, *faking* CollectableEntity
    2013-04-05 09:34:45,886 ERROR [org.nuclos.common.CollectableEntityFieldWithEntity] - CollectableEntityFieldWithEntity can only be serialized on the *client* side: Artikelgruppe, *faking* CollectableEntity
    2013-04-05 09:34:45,886 ERROR [org.nuclos.common.CollectableEntityFieldWithEntity] - CollectableEntityFieldWithEntity can only be serialized on the *client* side: gebucht, *faking* CollectableEntity

    2. Auswählen eines Datensatzes und öffnen der Detailansicht:

    2013-04-05 09:34:48,319 INFO [NovabitPerformanceLogger] - ;2;05.04.2013 09:34:48:316;05.04.2013 09:34:48:318;nuclos;Objekt: 40025348;Entity: Exercises;Reading the master data entity for an objekt if type Exercises ( static );;
    2013-04-05 09:34:48,321 INFO [NovabitPerformanceLogger] - ;5;05.04.2013 09:34:48:316;05.04.2013 09:34:48:321;nuclos;Objekt: 40025348;Entity: Lessons;Reading the master data entity for an objekt if type Lessons ( static );;

    3. Klonen (kein Log-Eintrag)

    4. Speichern

    2013-04-05 09:34:59,422 INFO [org.nuclos.server.common.ejb3.NuclosFacadeBean] - BEGIN executing business rules for event "Save" and entity Classes...
    2013-04-05 09:34:59,422 INFO [org.nuclos.server.common.ejb3.NuclosFacadeBean] - FINISHED executing business rules for event "Save" and entity Classes...
    2013-04-05 09:34:59,598 WARN [org.springframework.remoting.support.RemoteInvocationTraceInterceptor] - Processing of HttpInvokerServiceExporter remote call resulted in fatal exception: org.nuclos.server.genericobject.ejb3.GenericObjectFacadeRemote.modify
    java.lang.IllegalArgumentException: CollectableComparison.error
    at org.nuclos.common.collect.collectable.searchcondition.CollectableComparison.(CollectableComparison.java:82)
    at org.nuclos.common.SearchConditionUtils.newEOComparison(SearchConditionUtils.java:116)
    at org.nuclos.server.eventsupport.ejb3.EventSupportFacadeBean.getLayoutsByEntity(EventSupportFacadeBean.java:1001)
    at org.nuclos.server.eventsupport.ejb3.EventSupportFacadeBean.addDependantsFromDatabase(EventSupportFacadeBean.java:922)
    at org.nuclos.server.eventsupport.ejb3.EventSupportFacadeBean.addDependantsFromDatabase(EventSupportFacadeBean.java:953)
    at org.nuclos.server.eventsupport.ejb3.EventSupportFacadeBean.executeUpdateSupportEvent(EventSupportFacadeBean.java:1221)
    at org.nuclos.server.eventsupport.ejb3.EventSupportFacadeBean.fireSaveEventSupport(EventSupportFacadeBean.java:1552)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.nuclos.server.spring.FacadeLocalProxyFactoryBean$1.invoke(FacadeLocalProxyFactoryBean.java:76)
    at sun.proxy.$Proxy36.fireSaveEventSupport(Unknown Source)
    at org.nuclos.server.genericobject.ejb3.GenericObjectFacadeBean.fireSaveEvent(GenericObjectFacadeBean.java:1238)
    at org.nuclos.server.genericobject.ejb3.GenericObjectFacadeBean.modify(GenericObjectFacadeBean.java:1133)
    at org.nuclos.server.genericobject.ejb3.GenericObjectFacadeBean.modify(GenericObjectFacadeBean.java:1066)
    at org.nuclos.server.genericobject.ejb3.GenericObjectFacadeBean.modify(GenericObjectFacadeBean.java:1024)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:77)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at sun.proxy.$Proxy59.modify(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:205)
    at org.nuclos.server.common.NuclosRemoteInvocationExecutor.invoke(NuclosRemoteInvocationExecutor.java:162)
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78)
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:114)
    at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:73)
    at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:150)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:201)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
    2013-04-05 09:34:59,601 WARN [org.nuclos.server.common.NuclosRemoteInvocationExecutor] - Transaction rolling back now, because of java.lang.IllegalArgumentException: CollectableComparison.error: RemoteInvocation: method name 'modify'; parameter types [java.lang.Integer, org.nuclos.server.genericobject.valueobject.GenericObjectWithDependantsVO, java.lang.String](org.nuclos.server.genericobject.ejb3.GenericObjectFacadeBean@746ef917)

    Was sofort auffällt, ist der Fehler im Anschluss an die Suche – weiß nicht, ob das schon eine mögliche Ursache ist…

    Nachtrag zur Vollständigkeit: ist die aktuelle Version!

    Gruß,
    jproxx

    #6567
    Frank Pavlic
    Teilnehmer

    Hallo,
    der vollständige Stacktrace zeigt, dass die Exception aus dem nuclos-Kern kommt. Wenn ich den Stacktrace so lese, wird mit einem geklonten aber noch nicht gespeicherten Datensatz der UpdateEvent vorbereitet. Und in der Funktion addDependantsFromDatabase(…) wird dann die intid des geklonten Datensatzes als Komparand verwendet, welcher allerdings noch null ist. Sieht schwer nach Bug aus.

    Laut Stacktrace sieht es ganz danach aus, als dass deine Regel im Event „Aktualisieren“ geschieht, also noch bevor der geklonte Datensatz eingefügt wird. Wenn ich richtig liege, müsste deine Regel im Event „Aktualisieren (im Anschluss)“ funktionieren.
    Auf jeden Fall empfehle ich Dir ein JIRA aufzumachen mit den ganzen Daten von hier. Nebenbei kannst Du ja mal den Test mit „Aktualisieren (im Anschluss)“ machen.

    Gruß
    Frank

    #6568
    Thorsten Kreutz
    Teilnehmer

    Vielen Dank für deine Antwort – da ich den Kunden heute noch einen Test versprochen habe, bin ich einen umständlicheren Weg gegangen: ich habe den gesamten Teil parallel
    noch mal mit neuen Entitäten aufgebaut – und siehe da, zumindest der *faking*-Fehler ist weg.

    Ich konnte auch erstmalig die Datensätze klonen und speichern – habe mich schon gefreut. Aber seit dem ersten erfolgreichen Speichern kommt der CollectableComparison.error-Fehler wieder…

    Ich gehe dann mal deinen Empfehlungen nach…

Ansicht von 5 Beiträgen - 1 bis 5 (von insgesamt 5)