Page 1 of 1

REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Tue Sep 13, 2016 1:29 pm
by mzeller
Hallo,

ich migriere gerade eine Anwendung von jvx 2.0.1 auf 2.5.1 und habe Probleme mit der REST-Anbindung.

Mit Version 2.0.1 funktionierte dieser Request z.B. tadellos:

Code: Select all
http://localhost:8080/xyz/services/rest/desktop/at.xyz.vms.server.MobileData/action/userIdTest




Nach dem Update bekam ich mit dem gleichen Request stets Httpstatus 401 zurück. Bis ich herausgefunden habe, wieso:

Euer RESTAdapter hat sich geändert.

2.0.1
Code: Select all
RESTSession session = (RESTSession)pRequest.getClientInfo().getUser();


2.5.1
Code: Select all
LifeCycleConnector lcon = (LifeCycleConnector)pRequest.getClientInfo().getUser();



Dieser LifeCycleConnector holt sich in Zeile 98 einen Accesscontroller:
Code: Select all
IAccessController acc = Server.getInstance().getSessionManager().get(pMaster.getId()).getAccessController();


Leider wird hier beim Zugriff darauf ein paar Zeilen weiter nicht auf null geprüft, weshalb mein Request auf Grund einer NullPointerException ständig 401 lieferte. (Wäre vielleicht günstig, hier den Code zu ändern ;)

Das Problem habe ich selbst gelöst. Wir haben nämlich einen eigenen DBSecurityManager implementiert und bei der zu implementierenden Methode "getAccessController" bisher null geliefert.
Funktionierte so bei 2.0.1, aber nicht mehr bei 2.5.1 - deshalb liefere ich nun immer euren DefaultAccessController zurück. Sollte passen oder?


Nun funktioniert wenigstens die Authentifizierung, aber dennoch bekomme ich nun jedesmal Httpstatus 400 - Bad Request "The request could not be understood by the server due to malformed syntax".

Außerdem wird stets folgende Exception geworfen:
"PSQLException: FEHLER: Relation »v_accessrules« existiert nicht"

Ich nehme an, dass mir noch irgendwo eine Konfiguration oder etwas Ähnliches fehlt, etwas, das bei Version 2.0.1 nicht nötig war. Bitte um Hilfe.

Danke
Martin

PS: meine org.restlet Pakete habe ich bereits auf 2.3.2 aktualisiert.

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Tue Sep 13, 2016 2:51 pm
by rjahn
Ja, die Suche nach dem LCO Namen wurde erweitert, damit das Package nicht immer in der URL angegeben werden muss, z.B.

Code: Select all
http://localhost:8080/xyz/services/rest/desktop/MobileData/action/userIdTest

Es gibt JUnit Testklassen für JVx, mit denen wir das Verhalten überprüfen und natürlich können Sie für Ihre Services auch angelehnt daran ihre eigenen JUnit Tests erstellen.

Der AccessController wurde in 2.0.1 nicht bei den REST Services eingesetzt. Die NullPointerException ist ein BUG und sollte als Ticket erfasst werden (https://oss.sibvisions.com/).

Wo genau erhalten Sie die Exception für V_ACCESSRULES Exception?
Auch hierfür wäre ein Ticket hilfreich.

Es könnte sicherlich auch eine eigene IAccessController Implementierung verwendet werden, anstatt dem DefaultAccessController, je nachdem ob der Zugriff auf LCOs geregelt sein soll oder nicht.

Ohne Details, Stack Traces oder Verwendungszweck ist es schwer die richtige Hilfestellung zu geben.

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Tue Sep 13, 2016 5:14 pm
by mzeller
Hallo,

ich weiß jetzt, woran die weiteren Probleme liegen.
In der Klasse com.sibvisions.rad.server.http.rest.service.CallService wird nämlich wieder der LifeCycleConnector verwendet, wo dann wieder die gleiche NullPointerException auftritt:

Code: Select all
IAccessController acc = Server.getInstance().getSessionManager().get(pMaster.getId()).getAccessController();
//...
sLifeCycleName = acc.find(sDotName);


Und das führt dann zu einem 400 BAD REQUEST.

Bitte, was muss ich tun, damit der AccessController nicht null ist? In meinem eigenen DBSecurityManager gebe ich bei der Methode getAccessController bereits einen AccessController zurück und im config.xml habe ich auch diesen AccessController definiert.

Danke
Martin

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Wed Sep 14, 2016 9:32 am
by Support@SIB
Ihr Benutzer im Ticket System wurde in der Zwischenzeit aktiviert.

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Wed Sep 14, 2016 9:39 am
by Support@SIB
Haben Sie createAccessController in Ihrem security manager überschrieben oder getAccessController?

Wenn Sie nur createAccessController überschrieben haben, dann benötigen Sie die V_ACCESSRULES, wie beispielsweise:

Code: Select all
CREATE VIEW V_ACCESSRULES AS
SELECT u.USERNAME
      ,a.LIFECYCLENAME
  FROM USERS u,
       ACCESS a
 WHERE u.ACTIVE = 'Y'
   AND u.id = a.user_id


Es kann auch eine Tabelle mit dem Namen sein. Hauptsache die Spalten stimmen.

Wenn Sie natürlich getAccessController überschreiben haben, sollte die NullPointerException nicht auftreten.

Wie bereits von einem anderen User geschrieben wurde, kann ohne StackTrace kaum eine punktgenaue Hilfestellung gegeben werden.

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Wed Sep 14, 2016 9:49 am
by Development@SIB
Fraglich ist auch, warum eine ClassNotFoundException geworfen wird, sprich der AccessController überhaupt gefragt wird.

Wenn das LCO voll qualifiziert angegeben wird, wie in Ihrem Beispiel

Code: Select all
http://localhost:8080/xyz/services/rest/desktop/at.xyz.vms.server.MobileData/action/userIdTest


dann sollte der AccessController nicht benötigt werden?

Das würde bedeuten das die eingesetzte Klasse im URL nicht vorhanden ist!

Wenn die Klasse natürlich nicht voll qualifiziert ist, kommt es zur NPE.

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

PostPosted: Wed Sep 14, 2016 11:28 am
by mzeller
Danke für die vielen Hinweise. Nun konnte ich das Problem lösen.

Meine Vorgänger hatten die Methode getAccessController nicht überschrieben und so den DefaultAccessController genutzt, obwohl es in der DB keine V_ACCESSRULES gibt. Das bedeutete, dass die Methode getAccessController immer null lieferte. Mit Version 2.0.1 konnte man das scheinbar ignorieren. Bei der aktuellen Version 2.5.1 nicht mehr, weil hier die oben genannte NullPointerException im LifeCycleConnector auftritt und dann weder die Authentifizierung noch der Request funktioniert.
Nun habe ich die Methode getAccessController überschrieben und alles läuft.

Danke für die Hilfe
Martin