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

Grunderna i JAX-RPC 1.1

1. JAX-RPC
2. Klientsidan (SOAP,HTTP)
3. Serverdelen (SOAP,HTTP)
4. xsd-datatyper
5. xsd-datatyper: Primitiva typer och omslagsklasserna
6.
7.
8.
9.

1. JAX-RPC

JAX-RPC står för Java API for XML-based RPC (RPC=Remote Procedure Call), ett namn som är något missvisade eftersom man idag pratar om webbtjänster, inte "XML-baserad RPC". Därför har denna specifikation bytt namn till JAX-WS i version 2.0 .

Med JAX-RPC kan man bygga webbtjänster och applikationer med XML-funktionalitet enligt SOAP 1.1 specifikationen, JAX-RPC är alltså en specifikation av hur en Javaimplementation av SOAP 1.1 ska se ut.

2. Klientsidan (SOAP,HTTP)

Bilden nedan (tagen från JAX-RPC specifikationen) föreställer de olika steg som klienten utför då man utför ett RPC-anrop över SOAP och HTTP:



Nedan beskrivs stegen i detalj:

  1. mapRPCToSOAP: I detta steg mappas Javametoden, Javaparametrarna, returvärdet och eventuella undantag mot motsvarande delar i SOAP-meddelandet.
  2. processSOAPMessage: I detta steg byggs ett SOAP-meddelande från mappningen från föregående steg. Exakt hur XML-en i SOAP-meddelandet ska se ut bestäms av encoding style.
  3. processHTTPRequest: I detta steg byggs ett HTTP-meddelande som wrappar SOAP-meddelandet. Sedan överförs SOAP-meddelandet via HTTP till servern.

3. Serverdelen (SOAP,HTTP)

Grafen nedan (tagen från JAX-RPC specifikationen) visar vad som händer då servern tar emot ett RPC-anrop (över SOAP och HTTP):



Nedan beskrivs stegen i detalj:

  1. processHTTPRequest: HTTP-meddelandet tas emot.
  2. processSOAPMessage: Först extraheras SOAP-meddelandet från HTTP-meddelandet. Sedan extraheras SOAP Envelope, SOAP Body, SOAP Header och samtliga attachement. Dessa delar extraheras med hjälp av en XML-parser, t.ex. en SAX-parser.
  3. mapToRPC: SOAP-meddelandet mappas mot en av slutpunktens ("endpoint") metoder. Eventuella parametrar i SOAP Body mappas mot metodens Javaparametrar och eventuell kontextinformation i SOAP Header tolkas.
  4. dispatchToTarget:

4. xsd-datatyper

I JAX-RPC 1.1 definieras hur datatyper som definieras i WSDL (eller XML Schema) ska mappas till Java. Först tittar vi på enkla typmappningar, som innefattar vanliga datatyper som typiskt förekommer i programmeringsspråk och databaser.

  • xsd: De enkla datatyperna hämntas i en WSDL-fil vanligtvis från namnutrymmet xsd som deklararas med xmlns:xsd="http://www.w3.org/2001/XMLSchema".
Tabellen nedan visar hur de enkla datatyperna mappas mot datatyper i Java:

Datatyper i xsd Datatyp i Java Beskrivning
string  java.lang.String  -
integer  java.math.BigInteger  Typen integer definieras som en sträng av siffror som kan vara hur lång som helst. Även typerna positiveInteger, nonPositiveInteger, negativeInteger, nonNegativeInteger,
long  long  -9223372036854775808 < x < -9223372036854775807
int  int  -2147483648 < x < 2147483647
short  short  -32768 < x < 32767
byte  byte  -128 < x < 127
decimal  java.math.BigDecimal  -
double  double  -
float  float  -
boolean  boolean  -
date  java.util.Data  -
dateTime  java.util.Calendar  -
QName  javax.xml.namespace.QName  -
hexBinary  byte[]  -
base64Binary  byte[]  -

5. xsd-datatyper: Primitiva typer och omslagsklasserna

De xsd-typer som mappas mot primitiva datatyper är:

Datatyper i xsd Primär datatyp Beskrivning
long  long  -9223372036854775808 < x < -9223372036854775807
int  int  -2147483648 < x < 2147483647
short  short  -32768 < x < 32767
byte  byte  -128 < x < 127
double  double  -
float  float  -
boolean  boolean  -

Ibland måste man mappa dessa xsd-typer mot omslagsklasserna ("wrapper classes") d.v.s. Long, Integer, Short, o.s.v.

  • Varför räcker inte primära typer till? Jo, det finns nämligen flera sätt i XML-Schema att deklarera att ett element kan vara "optional", vilket betyder att det är valfritt att ta med elementet i XML-överföringen. Om man deklarerar elementet som "optional", och avsändaren väljer att inte skicka elementet måste vi på Java-sidan i detta fall kunna sätta motsvarande datatyp till "null". Eftersom en primär typ inte kan vara "null" måste vi använda omslagsklasserna i detta fall.
Det finns 3 sätta att bestämma att ett element är "optional":
  1. use="optional": Elementet är deklarerat med attributet use satt till optional. Här
  2. nillable="true": Elementet är deklarerat med attributet nillable satt till true.
  3. minOccurs="0": Elementet är deklarerat med attributet minOccurs satt till 0.
Nedan visas hur mappningen ser ut för omslagsklasserna:

Datatyper i xsd Omslagsklass Beskrivning
long  java.lang.Long  -9223372036854775808 < x < -9223372036854775807
int  java.lang.Integer  -2147483648 < x < 2147483647
short  java.lang.Short  -32768 < x < 32767
byte  java.lang.Byte  -128 < x < 127
double  java.lang.Double  -
float  java.lang.Float  -
boolean  java.lang.Boolean  -

6.

7.

8.

9.