REST-Anbindung jvx 2.0.1 => 2.5.1

Allgemeine Fragen zur Entwicklung von und mit JVx.

REST-Anbindung jvx 2.0.1 => 2.5.1

Postby mzeller » Tue Sep 13, 2016 1:29 pm

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.
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

Postby rjahn » Tue Sep 13, 2016 2:51 pm

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.
rjahn
 
Posts: 29
Joined: Sun Sep 13, 2009 1:54 pm

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

Postby mzeller » Tue Sep 13, 2016 5:14 pm

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
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

Postby Support@SIB » Wed Sep 14, 2016 9:32 am

Ihr Benutzer im Ticket System wurde in der Zwischenzeit aktiviert.
User avatar
Support@SIB
 
Posts: 200
Joined: Mon Sep 28, 2009 1:56 pm

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

Postby Support@SIB » Wed Sep 14, 2016 9:39 am

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.
User avatar
Support@SIB
 
Posts: 200
Joined: Mon Sep 28, 2009 1:56 pm

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

Postby Development@SIB » Wed Sep 14, 2016 9:49 am

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.
User avatar
Development@SIB
 
Posts: 311
Joined: Mon Sep 28, 2009 1:54 pm

Re: REST-Anbindung jvx 2.0.1 => 2.5.1

Postby mzeller » Wed Sep 14, 2016 11:28 am

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
mzeller
 
Posts: 22
Joined: Tue Apr 19, 2016 10:48 am
Location: Vienna


Return to Entwicklung