4

SOAP, JAX-WS, Metro a časy v `java.time` | robonovotny

 1 year ago
source link: https://novotnyr.github.io/scrolls/jax-ws-serializacia-java-time/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SOAP, JAX-WS, Metro a časy v `java.time`

SOAP, JAX-WS, Metro a časy v java.time

2022/10/31

Eclipse Metro nevie pracovať s balíčkom java.time.

To je zvláštne, lebo Java 8 je tu od roku 2014, ale vieme to napraviť!

V skutočnosti, s java.time nevie pracovať knižnica JAXB (Jakarta XML Data Binding), ale tá je súčasťou Metra.

Budeme potrebovať:

  • Javu aspoň 11, ale podpora beží veselo na Jave 17 — poslednom LTS v čase písania článku

  • Eclipse Metro pre Jakarta EE 10 (JAX-WS 4.0)

  • Binding customizations Prispôsobenia prevodu XML na objekty a späť, zvané tiež marshalling, či serializácia.

  • knižnicu ThreeTen, ktorá zavedie podporu pre triedy z java.time do JAXB.

  • Maven

  • plugin jaxws-maven-plugin z Metra

Súbor pre Maven

Do pom.xml pridajme závislosti na Metre a ThreeTen:

pom.xml
1 Eclipse Metro pre JAX-WS 4.0 v špecifikácii Jakarta EE 10.
2 Knižnica ThreeTen pre podporu „zabudnutých“ tried v JAXB.

Webservis s dátumami a časmi

Predstavme si webservis, ktorý pracuje s dátumami.

Najprv požiadavka:

Odpoveď bude obsahovať aktuálny čas:

Schéma pre správy

Schéma pokryje požiadavku aj odpoveď:

now.xsd
Schému dáme v projekte do adresára src/wsdl. Odtiaľ si ju vytiahne mavenovský plugin a tam ju nájde WSDL.

WSDL metadáta

WSDL metadáta budú pracovať s uvedenými správami v jedinej operácii: getNow:

now.wsdl
1 Schéma pre správy vo formáte XSD.
2 Schému zahrnieme pomocou include, keďže menný priestor WSDL (urn:example:now) a menný priestor schémy sa zhodujú.
3 Máme jedinú operáciu getNow.
Schému dáme v projekte do adresára src/wsdl. Odtiaľ si ju vytiahne mavenovský plugin.

Maven Plugin

Pridajme mavenový plugin, ktorý vygeneruje zdrojáky klienta:

pom.xml

Generovanie zdrojákov

Vygenerujme zdrojáky klienta:

Cieľ wsimport hľadá WSDL v adresári src/wsdl.

Uvidíme generované súbory:

target
├── generated-sources
│  └── wsimport
│     └── example
│        └── now
│           ├── ObjectFactory.java
│           ├── TimeService.java
│           └── TimeServices.java

Čo s dátumami?

Trieda TimeService bude pracovať s dátumami typu XMLGregorianCalendar:

TimeService.java
1 Metóda vracia XMLGregorianCalendar. To nám nevyhovuje.

XML Bindingy

Dodajme do projektu prispôsobenia mapovania XML na objekty a späť.

Dodáme XML Binding Customization.

Do adresára src/main/jaxws dodáme jaxb-bindings.xml.

V tomto adresári ho odhalí Maven plugin.
src/main/jaxws/jaxb-bindings.xml
1 Dôležité sú:
verzia

3.0, i keď používame JAB modernej verzie. Táto verzia platí i pre JAXB 4.0 (v JAX-WS 4.0).

implicitný menný priestor

https://jakarta.ee/xml/ns/jaxb. Pozor, používame menný priestor z projektu Jakarta!

menný priestor pre xjc

tento menný priestor je pre XJC — XML Java Compiler — prekladač XML na anotované Java triedy.

Špeciálne ho použijeme na prispôsobenie prekladu dátumov a časov.

menný priestor pre XML schému

deklarujeme menný priestor pre XML Schema (XSD), z neho vytiahneme dátový typ pre dátumy a časy

2 Deklarujeme pravidlá, ktoré platia globálne, pre všetky triedy.
3 Deklarujeme pravidlo, ktoré:
xmlType

vezme dátový typ z XML — tuto dátum a čas dateTime z XML Schema

name

namapuje ho na dátový typ z Javy

adapter

použije na to adaptér, teda Java kód. Ten použijeme z knižnice ThreeTen-JAXB.

Element javaType je z menného priestoru http://java.sun.com/xml/ns/jaxb/xjc (prefix xjc).

Pozor, existuje totiž aj rovnomenný element z https://jakarta.ee/xml/ns/jaxb (v súbore bez prípony), ten však nepodporuje adaptéry!

Vygenerujme znovu zdrojáky klienta:

Uvidíme, že už sa používa java.time.LocalDateTime.

TimeService.java
1 Používa sa LocalDateTime.
2 Generátor zdrojákov správne použije adaptér, ktorý sme uviedli v XML súbore.

Kód pre klienta

Kód pre klienta následne len využije generované zdrojáky:

Zdrojové kódy


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK