09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0The Source.
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.
Zieeeeeeeeeeeeeef ... JWSDP w wersji OpenSource dodane do portage :)
