programmera.net -> jax -> normal     för utskrift      info@programmera.net

Programmera klienten som anropar Calculator

1. Skriv en testklass: Main
2. Test 1: Division 3/9
3. Test 2: Division 3/0

1. Skriv en testklass: Main

Vi skriver en testklass Main.java som körs från prompten och tar tre argument. Det första vi gör är att använda klassen CalculatorServiceLocator för att komma åt en stubbe som implementerar gränssnittet CalculatorPortType. Du kan titta på klassen på:

Nu tar vi en titt på koden. Först måste vi hitta en stubbe av typen "CalculatorPortType", vilket vi gör med anropet "CalculatorServiceLocator.getCalculator()":

        CalculatorServiceLocator loc=null;
        CalculatorPortType stub = null;

        System.out.println("====================================");
        System.out.println("Main 1. Try locate service..");
        System.out.println("====================================");
        try{
            loc = new CalculatorServiceLocator();
            System.out.println("New CalculatorServiceLocator created.");
            stub = loc.getCalculator();
            System.out.println("CalculatorPortType created.");
        }catch( Exception e){
            System.err.println("Error when trying to find Calculator Service!");
            System.err.println("Check if service is deployed or server down.");
            e.printStackTrace();
            System.exit(2);
        }
Nästa intressanta del är själva funktionsaropet, som sker direkt på stubben:

                DivisionRequestType drt= new DivisionRequestType(a1,a2);
                floatRes= stub.division(drt);

2. Test 1: Division 3/9

Efter att Main är kompilerad testkör vi den på detta sätt:
[olle@dev1]$ cd classes/
[olle@dev1]$ java -cp .:$AXIS_CLASSPATH Main DIV 3 9
====================================
Main 1. Try locate service..
====================================
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
New CalculatorServiceLocator created.
CalculatorPortType created.
====================================
Main 2. Check parameters
====================================
====================================
Main 3. Try execute command..
====================================
====================================
Main 4. Print result..
====================================
The result of the operation DIV( 3, 9 ) was 0.33333334
Program finished!

Verkar funka. När vi kör programmet ovan skickas följande SOAP-meddelanden mellan klient och server:

<?xml version = '1.0' encoding = 'UTF-8'?>
<soapenv:Envelope 
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <division xmlns="http://www.programmera.net/ws/Calculator">
         <divisionRequestPart xmlns="">
            <dividend>3</dividend>
            <divisor>9</divisor>
         </divisionRequestPart>
      </division>
   </soapenv:Body>
</soapenv:Envelope>
Och svaret är:

<?xml version = '1.0' encoding = 'utf-8'?>
<soapenv:Envelope 
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <divisionResponse xmlns="http://www.programmera.net/ws/Calculator">
         <divisionReturn xmlns="">0.33333334</divisionReturn>
      </divisionResponse>
   </soapenv:Body>
</soapenv:Envelope>

3. Test 2: Division 3/0

Nu ska vi testa att köra ett exempel som resulterar i ett SOAP-fault, nämligen division med noll:
[olle@dev1]$ java -cp .:$AXIS_CLASSPATH Main DIV 3 0
====================================
Main 1. Try locate service..
====================================
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
New CalculatorServiceLocator created.
CalculatorPortType created.
====================================
Main 2. Check parameters
====================================
====================================
Main 3. Try execute command..
====================================
Error when trying to execute command!
AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
 faultSubcode:
 faultString:
 faultActor:
 faultNode:
 faultDetail:
        {http://www.programmera.net/ns/Calculator}DivideZeroFaultType:0Division by zero is not possible.
        {http://xml.apache.org/axis/}exceptionName:net.programmera.www.ns.Calculator.DivideZeroFaultType
        {http://xml.apache.org/axis/}hostname:okullberg-pc


        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:494)

Såhär ser SOAP-förfrågan ut:

<?xml version = '1.0' encoding = 'UTF-8'?>
<soapenv:Envelope 
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <division xmlns="http://www.programmera.net/ws/Calculator">
         <divisionRequestPart xmlns="">
            <dividend>3</dividend>
            <divisor>0</divisor>
         </divisionRequestPart>
      </division>
   </soapenv:Body>
</soapenv:Envelope>
Som svar får vi följande SOAP-meddelande:

<?xml version = '1.0' encoding = 'utf-8'?>
<soapenv:Envelope 
	xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Server.generalException</faultcode>
         <faultstring/>
         <detail>
            <ns1:DivideZeroFaultType xmlns:ns1="http://www.programmera.net/ns/Calculator">
               <offending-value>0</offending-value>
               <comment>Division by zero is not possible.</comment>
            </ns1:DivideZeroFaultType>
            <ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/">net.programmera.www.ns.Calculator.DivideZeroFaultType</ns2:exceptionName>
            <ns3:hostname xmlns:ns3="http://xml.apache.org/axis/">okullberg-pc</ns3:hostname>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>
Vi ser att "faultcode" är "Server", vilket betyder att servern tolkar detta fel som ett serverfel.