Ich hab mir da jetzt ein paar informationen durchgelesen und bin jetzt auf eine Unklarheit gestossen.
Wenn ich SOAP nutze, brauche ich ja die WSDL datei und aus der kann ich dann iwie .java files generieren. Richtig?
Nun soll aber mein Programm nicht einen speziellen JIRA Server ansprechen sondern, der User soll zur Laufzeit des Programms den Server angeben mit dem er kommunizieren will. Ist hierfür SOAP geeignet bzw versteh ich da iwie etwas falsch?
Leider finde ich auf der Seite kein Tutorial wie ich einen REST Client schreibe oder hab ich da etwas übersehen?
Und um nocheinmal auf meine Zuvor gestellte Frage einzugehen.
Sehe ich dass richtig, dass ich meine Problemstellung (mit einem Client auf unterschiedliche Jira Server zu verbinden) mit SOAP nicht lösen kann?
Doch man kann die Adresse der WSDL Datei auch zur Laufzeit übergeben, dass geht mit SOAP Problemlos. XML-RPC hatte damals ca. vor 6 Monaten viele Funktionen nicht, die aber per SOAP gehen.
Der REST Support ist mir neu. Wenn man es kann, sollte man vermutlich tatsächlich diesen nutzen, aber die Tutorial Seite ist imho noch sehr unvollständig...
Jap, stimme bygones da zu. Im Endeffekt muss man einfach nur HTTP GET Requests an die passende URL senden (bei JIRA kommt dann idr. noch irgendwie das mitsenden der Login Informationen dazu) und die Antwort (XML, JSON, HTML) parsen und in deine Objekte umwandeln (z.B. bei XML mit JAX-B).
Alternativ kann man eben auch die Jersey Client Klassen nutzen, das spart einem hier und da bestimmt Arbeit.
Die SOAP Sachen, sofern ich sie noch habe/finde lasse ich dir auf jeden Fall zu kommen.
bzg. REST bei JIRA weis irgendwer ab welcher Version vom JIRA-Server dies unterstütz wird
ich glaub ich hab irgendwo gelesen, dass dies erst mit der neuesten Version geht oder lieg ich da falsch?
ich find nur den beitrag nicht mehr wo das gestanden ist.
Sry, dass ich erst jetzt erst wieder was schreibe, bin aber gerade erst an nen PC gekommen.
1) Zu der Versionsfrage, musst du mal selber auf der JIRA Seite suchen, hatte da bisher nix zu gelesen und hab jetzt keine Lust zu suchen
2) Das Projekt habe ich von der Arbeit kopiert, werde dann morgen das ganze so verkleinern, dass es als Beispiel/Start für dich passt. Hoffe du kannst Ant, denn darüber generiere ich z.B. die JIRA SOAP Klassen. Denke mal, dass ich das bis ca. 12:00 geschafft haben sollte.
So
Es ist jetzt entschieden worden, dass es über SOAP gelöst werden soll.
Hab jetzt leider nur das Problem, dass ich z.B die WSDL datei von http://jira.atlassian.com/rpc/soap/jirasoapservice-v2?wsdl
weder mit wsimport noch mit wsdl2java parsen kann.
hab dann versucht die kommunikation mit JIRA ohne WSDL -Datei zu realisieren, z.B über Dynamic Interface Invokation, und das funktioniert auch bis zu einem gewissen grad (ich kann mich anmelden und wieder ausloggen). Aber sobald ich eine Methode aufrufe die eine Object zurückliefert das kein JAVA Standard Typ ist bekomme ich diese Exception
[c] org.xml.sax.SAXException: No deserializer defined for array type {http://beans.soap.rpc.jira.atlassian.com}RemoteProject[/c]
was verständlich ist, da ja mein Programm nicht wissen kann wie er dies parsen/deserialisieren soll.
Hier ist mal mein CODE mit dem ich das versuchen wollte
Java:
packagejira.test.soap;importjava.rmi.RemoteException;importjavax.xml.namespace.QName;importjavax.xml.rpc.Call;importjavax.xml.rpc.ServiceException;importjavax.xml.rpc.ServiceFactory;importjavax.xml.rpc.Service;importcom.atlassian.jira.rpc.soap.beans.RemoteProject;importcom.atlassian.jira.rpc.soap.*;publicclassMain{staticfinalString LOGIN_NAME ="amunra";staticfinalString LOGIN_PASSWORD ="";staticfinalString SERVICE_NAME="JiraSoapServiceService";staticfinalString URI_="impl:jirasoapservice-v2SoapBinding";staticfinalString ENDPOINT ="http://jira.atlassian.com/rpc/soap/jirasoapservice-v2";staticfinalString WSDLLOCATION="http://jira.atlassian.com/rpc/soap/jirasoapservice-v2?wsdl";privatestaticString token;privatestaticCall call;privatestaticService service;privatestaticboolean loggedin =false;/**
* @param args
*/publicstaticvoidmain(String[] args){try{ServiceFactory factory =ServiceFactory.newInstance();
service= factory.createService(new java.net.URL(WSDLLOCATION),newQName(ENDPOINT, SERVICE_NAME));
call=(Call)service.createCall();login();askAllProjects();//<---- BEI DIESER METHODE TRITT DER FEHLER AUFlogout();}catch(org.apache.axis.AxisFault fault){if(loggedin){logout();}System.out.println("AXIS FAULT");System.out.println("Fault Code: "+fault.getFaultCode());System.out.println("Fault String: "+fault.getFaultString());System.out.println("Fault Details: "+fault.getFaultDetails());System.out.println("Fault Reason: "+ fault.getFaultReason());System.out.println("Fault Role: "+fault.getFaultRole());
fault.printStackTrace();}catch(Exception e){if(loggedin){logout();}System.out.println("Failure during execution of the command");System.err.println(e);}}privatestaticvoidaskAllProjects()throwsRemoteException,ServiceException{//Dynmaic Proxy// JiraSoapService soapservice= (JiraSoapService) service.getPort(new QName(ENDPOINT, "jirasoapservice-v2"), JiraSoapService.class);//Dynmaic Interface Invokation
call.setOperationName(newQName(ENDPOINT,"getProjectsNoSchemes"));RemoteProject[] output=(RemoteProject[])call.invoke(newObject[]{token});}publicstaticvoidlogin()throwsRemoteException{
call.setOperationName(newQName(ENDPOINT,"login"));
call.setTargetEndpointAddress(ENDPOINT);
token=(String)call.invoke(newObject[]{
LOGIN_NAME,
LOGIN_PASSWORD});System.out.println("you are logged in successfully!\n your token is:\n"+ token);
loggedin=true;}privatestaticvoidlogout(){try{
call.setOperationName(newQName(ENDPOINT,"logout"));
call.setTargetEndpointAddress(ENDPOINT);if((Boolean)call.invoke(newObject[]{token}))System.out.println("Logout successful");}catch(org.apache.axis.AxisFault fault){System.out.println("AXIS FAULT");System.out.println("Fault Code: "+fault.getFaultCode());System.out.println("Fault String: "+fault.getFaultString());System.out.println("Fault Details: "+fault.getFaultDetails());System.out.println("Fault Reason: "+ fault.getFaultReason());System.out.println("Fault Role: "+fault.getFaultRole());
fault.printStackTrace();}catch(Exception e){System.out.println("Failure during execution of the command logout");System.err.println(e);}}}
Also ich weiß es nicht mehr genau, aber ich hatte zumindest mit Axis2 auch Probleme, weil deren WSDL sich wohl nicht 100% an die Spezifikation hält. Deshalb habe ich Axis1 benutzt, das WSDL2Java funktioniert nämlich.
Wenn du das ganze als Eclipse Project benutzen möchtest, musst du folgende Ordner zu Source-Foldern machen:
Code:
src/java
src/conf
build/gen-src
build/gen-src erscheint erst, nachdem man das Ant-Target: build aufgerufen hat (hier landen die aus der WSDL generieren Klassen.
Zum testen habe ich mir gerade hier: System Dashboard - Atlassian Software Inc. einen Account angelegt. Wenn du das auch machst, musst du nur noch in der Main-Klasse User/Passwort eintragen, dann bekommst du den Projectleader des Projectes JRA angezeigt.