Hallo zusammen,
ich habe ein Problem, welches mich vor ein Rätsel stellt:
Ich habe ein Service Modul geschrieben, welches auf dem FirstSpirit 5.1 Server läuft (und auch aktiv ist).
Innerhalb dieses Moduls habe ich zudem eine Option List Komponente implementiert vom Typ
GomIncludeValueProvider<Option>
welches in einem Formular auf einer Seite verwendet wird (Hier im Beispiel Seite "X"), sowie ein paar Library Klassen.
Das Szenario läuft wie folgt ab:
Ein Scheduled Task ruft eine Klasse auf, die dann folgendes macht:
- FormData der Seite "X" holen
- Optionsliste mit eigener GomIncludeValueProvider Implementierung öffnen und den ausgewählten Wert ermitteln.
- Weiter verarbeiten mit ermitteltem Wert.
Die Implementierung:
public class MyList implements GomIncludeValueProvider<Option>
{
private static final List<Option> list = new ArrayList<>();
@Override
public Class<Option> getType()
{
return Option.class;
}
private boolean requireNewProjectList()
{
synchronized (list)
{
return list.isEmpty();
}
}
@Override
public List<Option> getValues(SpecialistsBroker sb)
{
if (requireNewProjectList())
{
final MyService pService = getMyService(sb);
updateList ( pService.getTranslationProjects() );
}
synchronized (list)
{
return list;
}
}
public static void updateList(List<TranslationProject> vpList)
{
if (vpList == null || vpList.isEmpty())
{
Logging.logError("given project list is empty.", TMSProjectList.class);
return;
}
synchronized(list)
{
list.clear();
for (MyProject _project : vpList)
list.add( createOption(_project) );
}
}
private static MyService getMyService(SpecialistsBroker sb)
{
MyService pService;
try
{
final ServicesBroker servicesBroker = sb.requireSpecialist(ServicesBroker.TYPE);
pService = servicesBroker != null ? servicesBroker.getService(MyService.class) : null;
if (pService == null && servicesBroker != null)
Logging.logError("cannot obtain service from broker", MyService.class);
}
catch(Exception ex)
{
Logging.logError("Could not get MyService due to invalid broker or connection: " + ex.getMessage(), getClass().getName());
pService = null;
}
return pService;
}
}
Das Problem:
Sobald das Formular Element geladen wird wird natürlich auch versucht, den Wert der Eingabekomponente zu ermitteln, somit wird also mittels
MyList.getValues();
alle Werte aus meiner Liste
MyList.list
geladen.
Es kommt nun alle 7 Jahre dazu, dass die Liste leer ist, obwohl sie im System eigentlich befüllt ist. Da die Liste leer ist würde versucht werden, die Liste neu zu befüllen und die Werte werden von MyService abgefragt.
Das Problem ist nun, dass MyService nicht gefunden werden kann!
Der Stracktrace ist wie folgt:
WARN 19.03.2015 18:06:09.938 (de.espirit.firstspirit.server.io.AbstractServiceLocator): incompatible class loaders? de.espirit.firstspirit.server.module.ExtendedUrlClassLoader@9bcc4c-300 / de.espirit.firstspirit.server.module.ExtendedUrlClassLoader@1d2d7c9-122
ERROR 19.03.2015 18:06:09.954 (com.idmedia.fts.fs.service.module.FirstTranslationService): Could not get MyService due to invalid broker or connection: Cannot cast com.sun.proxy.$Proxy7 to com.idmedia.fts.fs.service.module.MyService
java.lang.ClassCastException: Cannot cast com.sun.proxy.$Proxy7 to com.idmedia.fts.fs.service.module.MyService
at java.lang.Class.cast(Class.java:3133)
at de.espirit.firstspirit.server.io.AbstractServiceLocator.getService(AbstractServiceLocator.java:96)
at de.espirit.firstspirit.server.io.AbstractServerConnection.getService(AbstractServerConnection.java:567)
at de.espirit.firstspirit.client.io.ProjectConnection.getService(ProjectConnection.java:101)
at de.espirit.firstspirit.agency.ServicesBrokerImpl.getService(ServicesBrokerImpl.java:26)