CMDBuild Forum

Webservice. Realizzazione client java di esempio

Salve, dopo avere istallato e configurato CMD-Build 1.0, per la realizzazione del client java di test ho utilizzato come riferimento il documento webservice-manual.pdf ed il plugin di Eclipse disponibile al seguente link: http://ws.apache.org/axis2/tools/1_4_1/eclipse/wsdl2java-plugin.html , per la generazione dello stub.
 
Questo è il codice client scritto da me:

ConfigurationContext configContext = null;
            try {
                configContext = ConfigurationContextFactory.createConfigurationContextFromURIs(
                        null,
                        new URL("http://192.168.42.6/axis2repo/"));
            } catch (MalformedURLException e) {
               
                e.printStackTrace();
            }
            stub = new WebservicesStub(configContext);
            StAXOMBuilder builder= null;
            URL policyURL = new URL("http://192.168.42.6/axis2repo/conf/policy.xml");
            URLConnection policyUC = policyURL.openConnection();                               
            builder = new StAXOMBuilder(policyUC.getInputStream());
            Options options = stub._getServiceClient().getOptions();
            options.setUserName("admin");
            options.setPassword("admin");
            Policy policy= PolicyEngine.getPolicy(builder.getDocumentElement());
            options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,policy);
          
            GetCardList list = new GetCardList();
            list.setClassName("Computer");
            GetCardListResponse response = stub.getCardList(list);
            Card[] card = response.get_return();

            for (int i = 0; i < card.length; i++) {
                System.out.println(card[i].getDescription());
            }

Lanciando l'applicazione viene sollevata l'eccezione che riporto sotto alla seguente linea di codice: 
GetCardListResponse response = stub.getCardList(list);

Sapreste individuare il problema?
Grazie,
Francesco.

org.apache.axis2.AxisFault: First Element must contain the local name, Envelope , but found html

at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)

at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:90)

at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:353)

at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416)

at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)

at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)

at org.cmdbuild.services.soap.WebservicesStub.getCardList(WebservicesStub.java:6642)

at it.eng.cmdbuild.ws.client.Main.main(Main.java:41)

Caused by: org.apache.axiom.soap.SOAPProcessingException: First Element must contain the local name, Envelope , but found html

at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.constructNode(StAXSOAPModelBuilder.java:251)

at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createOMElement(StAXSOAPModelBuilder.java:209)

at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.createNextOMElement(StAXSOAPModelBuilder.java:191)

at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:172)

at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.getSOAPEnvelope(StAXSOAPModelBuilder.java:156)

at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.<init>(StAXSOAPModelBuilder.java:105)

at org.apache.axis2.builder.BuilderUtil.getSOAPBuilder(BuilderUtil.java:677)

at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:182)

at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:112)

at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:88)

... 6 more

Ciao Francesco,

dall'errore che hai allegato pare che il tuo client riceva in risposta dal server un messaggio in html (org.apache.axis2.AxisFault: First Element must contain the local name, Envelope , but found html).

Sicuramente il processo di autenticazione fallisce (se guardi il messaggio soap di risposta troverai l'html di una pagina di errore). Nel frammento di codice postato hai dimenticato di fare l'engage del modulo rampart necessario per inviare un messaggio soap con autenticazione. Puoi fare l'engage del modulo nel seguente modo:

stub._getServiceClient().engageModule("rampart");

Il modulo rampart (rampart.mar) deve trovarsi nel repository che indichi nel secondo parametro del metodo createConfigurationContextFromURIs.

Inoltre quando vai ad istanziare il nuovo oggetto WebservicesStub non gli specifichi un path. Con il codice generato dal tool wsdl2java, il costruttore utilizza l'url specificato nel file WSDL che è stato utilizzato per la generazione del codice. Se per caso l'url è diverso da quello in cui si trova l'istanza di CMDBuild, il processo di autenticazione potrebbe fallire.

In fase di sviluppo ti consiglio di verificare sempre il contenuto dei messaggi SOAP che scambi con il server (puoi utilizzare un tool come tcpmon, che è molto semplice e ti fornisce tutte le informazioni di cui hai bisogno) e di alzare i livelli di log di cmdbuild, mettendo, ad esempio, a DEBUG i livelli di persist e soap (qui puoi trovare come fare). Se il problema persiste, verifica che il repository che specifichi sia raggiungibile.

Giuseppe