09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0
The Source.
Kategorie: general
Opublikowany: 10 maja 2007, 23:06
Komentarze: Dodaj komentarz

Jak korzystać z dobrodziejstwa Web services w Gentoo? Oto mały poradnik dotyczący JAXB.

Zaczynamy od zainstalowania JAXB:

# emerge -av jaxb-tools

Teraz potrzebujemy katalog projektu:

$ mkdir -p projekt/{bin,src,lib}

Nasz przykładowy plik XML (sample.xml):

<?xml version="1.0" encoding="UTF-8"?>
<dane>
  <osoba imie="Jan" nazwisko="Kowalski">
    <id pesel="00000000000"/>
  </osoba>
  <osoba imie="Janina" nazwisko="Kowalska">
    <id pesel="00000000001" dowod="AAA00000"/>
  </osoba>
</dane>

Tworzymy dla niego plik XML Schema (sample.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd">
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="dane">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded" minOccurs="1">
        <xs:element name="osoba" type="typeOsoba"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="typeOsoba">
    <xs:all minOccurs="1" maxOccurs="1">
      <xs:element name="id" type="typeId"/>
    </xs:all>
    <xs:attribute name="imie" type="xs:string" use="required"/>
    <xs:attribute name="nazwisko" type="xs:string" use="required"/>
  </xs:complexType>
  <xs:complexType name="typeId">
    <xs:attribute name="pesel" type="xs:string" use="required"/>
    <xs:attribute name="dowod" type="xs:string" use="optional"/>
  </xs:complexType>
</xs:schema>

Sprawdzamy jeszcze poprawność XML Schema i przykładowego pliku XML:

$ xmllint --valid --noout sample.xsd
$ xmllint --noout --schema sample.xsd sample.xml

Teraz już jesteśmy gotowi do wykorzystania XJC - kompilatora XML Schema, da on nam w rezultacie gotowe klasy Javy:

$ xjc-2 -d src/ -p net.nelchael.jaxb.generated sample.xsd

Wygenerowane pliki:

  • net.nelchael.jaxb.generated.Dane
  • net.nelchael.jaxb.generated.ObjectFactory
  • net.nelchael.jaxb.generated.TypeId
  • net.nelchael.jaxb.generated.TypeOsoba

Potrzebujemy jeszcze paru bibliotek:

$ ln -s /usr/share/codemodel-2/lib/codemodel.jar lib/
$ ln -s /usr/share/istack-commons-runtime/lib/istack-commons-runtime.jar lib/
$ ln -s /usr/share/jaxb-2/lib/jaxb-api.jar lib/
$ ln -s /usr/share/jaxb-2/lib/jaxb-impl.jar lib/
$ ln -s /usr/share/jaxb-tools-2/lib/jaxb-tools.jar lib/
$ ln -s /usr/share/jsr173/lib/jsr173.jar lib/
$ ln -s /usr/share/relaxng-datatype/lib/relaxngDatatype.jar lib/
$ ln -s /usr/share/rngom/lib/rngom.jar lib/
$ ln -s /usr/share/sun-jaf/lib/activation.jar lib/
$ ln -s /usr/share/xerces-2/lib/xercesImpl.jar lib/
$ ln -s /usr/share/xsom/lib/xsom.jar lib/

Teraz już jesteśmy gotowi do napisania klasy korzystającej z danych (src/net/nelchael/jaxb/Projekt.java):

package net.nelchael.jaxb;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import net.nelchael.jaxb.generated.Dane;
import net.nelchael.jaxb.generated.ObjectFactory;
import net.nelchael.jaxb.generated.TypeId;
import net.nelchael.jaxb.generated.TypeOsoba;

public class Projekt {

	public static void main(String[] args) {

		try {

			JAXBContext context = JAXBContext.newInstance(ObjectFactory.class);
			Unmarshaller unmarshaller = context.createUnmarshaller();

			Dane dane = (Dane)unmarshaller.unmarshal(new File("sample.xml"));

			for (TypeOsoba osoba : dane.getOsoba()) {

				System.out.println("Osoba: " + osoba.getNazwisko() + ", " + osoba.getImie());
				TypeId id = osoba.getId();
				System.out.print(" Pesel: " + id.getPesel());
				if (id.getDowod() != null)
					System.out.print(", dowód osobisty: " + id.getDowod());
				System.out.println();

			}

		} catch (JAXBException e) {
			e.printStackTrace();
		}

	}

}

Na tym etapie przyda się już plik build.xml dla Ant:

<?xml version="1.0"?>
<project name="jaxb" default="compile">
  <path id="globalClassPath">
    <fileset dir="lib/" includes="*.jar"/>
    <pathelement path="bin/"/>
  </path>
  <taskdef name="xjc" classname="com.sun.tools.xjc.XJC2Task" classpathref="globalClassPath"/>
  <target name="xjc">
    <xjc schema="sample.xsd" package="net.nelchael.jaxb.generated" destdir="src/"/>
  </target>
  <target name="compile">
    <javac target="1.5" source="1.5" srcdir="src" destdir="bin/" encoding="UTF-8" classpathref="globalClassPath"/>
  </target>
  <target name="clean">
    <delete verbose="true" dir="bin/net"/>
  </target>
  <target name="run">
    <java classpathref="globalClassPath" classname="net.nelchael.jaxb.Projekt"/>
  </target>
</project>

Wszystko gotowe, więc uruchamiamy XJC, ...

$ ant xjc

... kompilujemy projekt, ...

$ ant compile

... w końcu uruchamiamy:

$ ant run

Spodziewany wynik:

$ ant run
Buildfile: build.xml

run:
     [java] Osoba: Kowalski, Jan
     [java]  Pesel: 00000000000
     [java] Osoba: Kowalska, Janina
     [java]  Pesel: 00000000001, dowód osobisty: AAA00000

BUILD SUCCESSFUL
Total time: 2 seconds
$ 

Jak widać korzystanie z JAXB w Gentoo jest dość proste - wszystkie potrzebne biblioteki są już w portage, wystarczy zainstalować ;) Bardzo dobry tutorial dotyczący Web services jest na stronie Sun'a.

Niedługo postaram się umieścić podobny tutorial, ale dotyczący JiBX.

Kategorie: devel Techblog
Opublikowany: 03 maja 2007, 15:16
Komentarze: 4 komentarze
 :)

Zieeeeeeeeeeeeeef ... JWSDP w wersji OpenSource dodane do portage :)

Kategorie: devel
Opublikowany: 01 maja 2007, 23:56
Komentarze: Dodaj komentarz