Salve a tutti, sto iniziando a studiare come creare dei web service con axis2 ma mi sto imbattendo in alcuni problemi.
Ho creato la classe che definisce le operazioni rese disponibili dal web service, la classe è la seguente:
In particolare l'ultima operazione (getCatalogo) utilizza una classe che ho definito io.codice:public class StockQuoteService { private HashMap map = new HashMap (); public double getPrice(String symbol){ Double price = (Double) map.get(symbol); if(price!=null) return price.doubleValue(); return 42.0; } public void update(String symbol, double price){ map.put(symbol, new Double(price)); } public Prodotto[] getCatalogo(){ Prodotto[] catalogo = new Prodotto[map.size()]; Set chiavi = map.keySet(); Iterator it = chiavi.iterator(); for(int i=0; i< chiavi.size(); i++){ String key=(String)it.next(); catalogo[i]= new Prodotto(key, ((Double) map.get(key)).doubleValue()); } return catalogo; } }
Detto ciò ho generato il pacchetto aar da installare su tomcat (tramite il tool di eclipse "Axis2 service archive") ed ho installato il web service.
A questo punto provo a generare le classi per il client ma ottengo questo errore:
Nonostante l'errore vengono generate due classi: StockQuoteServiceStub.java e StockQuoteServiceCallbackHandler.java. Se provo ad utilizzare ugualmente quelle classi riesco ad invocare correttamente getPrice, invoco l'operazione update solo che se dopo invoco un getPrice l'update sembra non aver sortito nessun effetto.angelo@angelo-laptop:~$ wsdl2java.sh -uri http://127.0.0.1:8080/axis2/services...teService?wsdl -p samples.ws.client
Using AXIS2_HOME: /home/angelo/axis2-1.4
Using JAVA_HOME: /usr/lib/jvm/java-6-sun
Retrieving document at 'http://127.0.0.1:8080/axis2/services/StockQuoteService?wsdl'.
Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationExcept ion: java.lang.NullPointerException
at org.apache.axis2.wsdl.codegen.CodeGenerationEngine .generate(CodeGenerationEngine.java:271)
at org.apache.axis2.wsdl.WSDL2Code.main(WSDL2Code.jav a:35)
at org.apache.axis2.wsdl.WSDL2Java.main(WSDL2Java.jav a:24)
Caused by: java.lang.NullPointerException
at org.apache.axis2.wsdl.codegen.extension.JavaPretty PrinterExtension.prettify(JavaPrettyPrinterExtensi on.java:50)
at org.apache.axis2.wsdl.codegen.extension.JavaPretty PrinterExtension.prettify(JavaPrettyPrinterExtensi on.java:51)
at org.apache.axis2.wsdl.codegen.extension.AbstractPr ettyPrinterExtension.engage(AbstractPrettyPrinterE xtension.java:37)
at org.apache.axis2.wsdl.codegen.CodeGenerationEngine .generate(CodeGenerationEngine.java:265)
... 2 more
Quando invece provo ad invocare getCatalogo come risposta dal web service ottengo null.
Di seguito incollo il client che ho scritto con l'output che mi viene dato:
Codice:
L'output è questo:codice:public class X { private StockQuoteServiceStub sqss; public X() throws AxisFault { sqss = new StockQuoteServiceStub(); } public static void main(String[] args) throws RemoteException { X classe = new X(); classe.update("fiat", 50.0); classe.update("opel", 72.2); classe.update("mercedes", 100); System.out.println(classe.getPriceW("fiat")); System.out.println(classe.getPriceW("mercedes")); System.out.println(classe.getPriceW("skoda")); System.out.println(classe.getPriceW("opel")); Prodotto[] ps = classe.getCatalogo(); for(int i=0; i<ps.length; i++) System.out.println("Catalogo"+ps[i].getNome()+", "+ps[i].getPrezzo()); } public double getPriceW(String nome) throws RemoteException{ GetPrice parametro = new GetPrice(); parametro.setSymbol(nome); GetPriceResponse grp = sqss.getPrice(parametro); return grp.get_return(); } public void update(String nome, double prezzo) throws RemoteException{ Update imp = new Update(); imp.setSymbol(nome); imp.setPrice(prezzo); sqss.update(imp); } public Prodotto[] getCatalogo() throws RemoteException{ GetCatalogoResponse risposta = sqss.getCatalogo(); Prodotto[] catalogo = risposta.get_return(); return catalogo; } }
Cosa completamente sbagliata, dato che 42 mi deve venir tornato solamente se il prodotto non è inserito nella HashMap definita nel web service.42.0
.....
42.0
Exception in thread "main" java.lang.NullPointerException
at X.main(X.java:42)
Perchè un comportamento simile? Cosa sbaglio?
Un'ultima cosa, per generare le classi stub ho installato anche il plug-in per eclipse di axis2 (Axis2 code generator), ma questo tool a quanto ho potuto notare non mi funziona mai e non mi da mai nessun file in output mi da un messaggio d'errore:
Quote:
An error occurred while completing process - java.lang.reflect.invocationTargetException
Questo lo ottengo anche se scrivo un altro web service con una sola operazione che fa un'addizione, a questo punto penso sia un problema del plug-in o sbaglio?
Grazie a tutti.
Ciao ciao