söndag 11 oktober 2009

WS & Android


Har grejjat lite med Androidappar efter att jag styrde upp mina fina bönor som webbservicear på Glassfish. Det finns en skön patchad KSOAP2 implementation för Android så man enkelt kan snacka med sina servicar. Funkar ju onekligen, men jag vet  väl inte om jag tycker det är direkt smidigt. Bara för att man kan göra soapanrop betyder ju inte att det är smidigt att använda. Kanske enklare att bara köra RESTful prylar och skippa hela soap-biten. Men så jag kommer ihåg hur det var jag grejjade så bloggar jag koden iaf.

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

...    
    private static final String SOAP_ACTION = "getTest";
    private static final String METHOD_NAME = "getTest";
    private static final String NAMESPACE
"http://test.danielsundberg.nu/";
    private static final String URL 
"http://services.danielsundberg.nu/TestService/TestBean?wsdl"; 
    private Object resultRequestSOAP = null;
   
...

      private void search() {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

       //SoapObject
       request.addProperty("arg0", imeibox.getText().toString());
       SoapSerializationEnvelope envelope = 
         new SoapSerializationEnvelope(SoapEnvelope.VER11);
       envelope.setOutputSoapObject(request);

       AndroidHttpTransport androidHttpTransport = 
         new AndroidHttpTransport(URL);
       try {
           androidHttpTransport.call(SOAP_ACTION, envelope);
           resultRequestSOAP = envelope.getResponse();
           SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;
           SoapObject result = 
(SoapObject) resultsRequestSOAP.getProperty("return");
           text.setText("Result: "+result.getProperty("firstResult");
           }         
       }
       catch (Exception e) {
           text.setText("An error occured while searching '" +
             e.getClass() + "'");
       } 
    }
Funkar men är ju inte direkt smidigt, har inte lyckats casta till några typer andra än bastyperna, men jag har väl inte undersökt jättenoga heller. Hur som så är det ju ballt att kunna snacka soap från en androidapp bara sådär. Kanske inte direkt skivat bröd, men väl som en kasse bärs.

torsdag 8 oktober 2009

EJB3 & WLS10

Efter att ha testat runt lite känns det som om jag missat nått. Jag verkar inte vara ensam om att inte lyckas accessa mina remotebönor på en klient heller. Först var det lite forskning att hitta åt mappingName (som förstås var specifikt för weblogic) men nu hittar jag iaf bönorna i JNDI. Dock när jag försöker instansiera dem i klienten så får jag ett spännande ClassCastException. Var ju också ruskigt smidigt att få till en webbservice av bönorna.


Bönan
@Local({TestLocal.class})
@Remote({TestRemote.class})
@Stateless(name="TestBean", mappedName="ejb/Test", 
description="Test implementation.")
@WebService(endpointInterface = 
"nu.danielsundberg.service.TestRemote",
serviceName="TestRemote")
public class TestBean implements TestLocal, TestRemote {
    @javax.jws.WebMethod()
    public int test(int tal1, int tal2) {
        return tal1+tal2;
    }
} 

Localinterface
@Local 
public interface Test{
    int test(int tal1, int tal2);
}

Remoteinterface
@Remote
@WebService
@SOAPBinding(style = 
javax.jws.soap.SOAPBinding.Style.DOCUMENT)
public interface TestRemote extends Test{
}


Bönorna dyker upp i domänens JNDI-träd okej, frågan är om jag har packat ihop mitt projekt på nått fel sätt så att klassladdarstrul uppstår. Webbservicen blir iaf klockren. Ska replikera mitt projekt och testa i Glassfish istället och kolla om den klarar sig lite bättre.

Dock verkar EJB3-standarden vara lite som skivat bröd, jäkligt smidigt dvs.